如何使用Mockito模拟类中的一个静态方法?

2022-09-02 01:21:58

以下行似乎模拟了类中的所有静态方法:

MockedStatic <Sample> sampleMock = Mockito.mockStatic( Sample.class );
sampleMock.when( () -> Sample.sampleStaticMethod( Mockito.any( String.class ) ) ).thenReturn( "response" );

是否可以在类中仅模拟一个静态方法?


答案 1

默认情况下,所有方法都是模拟的。但是,您可以使用将模拟配置为实际触发实际方法,仅排除一个。Mockito.CALLS_REAL_METHODS

例如,给定的类:Sample

class Sample{
    static String method1(String s) {
        return s;
    }
    static String method2(String s) {
        return s;
    }
}

如果我们只想模拟:method1

@Test
public void singleStaticMethodTest(){
    try (MockedStatic<Sample> mocked = Mockito.mockStatic(Sample.class,Mockito.CALLS_REAL_METHODS)) {
        mocked.when(() -> Sample.method1(anyString())).thenReturn("bar");
        assertEquals("bar", Sample.method1("foo")); // mocked
        assertEquals("foo", Sample.method2("foo")); // not mocked
    }
}

请注意,真实仍将被调用。来自文档:Sample.method1()Mockito.CALLS_REAL_METHODS

在使用旧代码时,此实现可能很有用。使用此实现时,未存根的方法将委托给实际实现。这是一种创建默认调用真实方法的部分模拟对象的方法。...

注 1:使用语法对部分模拟进行存根操作将调用 real 方法。对于部分模拟,建议使用语法。when(mock.getSomething()).thenReturn(fakeValue)doReturn

因此,如果您根本不想触发 stubbed 静态方法,解决方案是使用语法(如文档所建议的那样),但对于静态方法仍然不受支持:doReturn

@Test
public void singleStaticMethodTest() {
    try (MockedStatic<Sample> mocked = Mockito.mockStatic(Sample.class,Mockito.CALLS_REAL_METHODS)) {
        doReturn("bar").when(mocked).method1(anyString()); // Compilation error!
        //...
    }
}

关于这一点,有一个悬而未决的问题,特别是检查此评论


答案 2

推荐