默认情况下,所有方法都是模拟的。但是,您可以使用将模拟配置为实际触发实际方法,仅排除一个。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!
//...
}
}
关于这一点,有一个悬而未决的问题,特别是检查此评论。