默认情况下,所有方法都是模拟的。但是,使用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:使用
when(mock.getSomething()).thenReturn(fakeValue) 语法将调用
真正的方法。对于部分模拟,建议使用doReturn
语法。
因此,如果您根本不想触发存根静态方法,解决方案是使用语法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!
//...
}
}
关于这个有一个open issue,特别检查这个comment。