对于使用JUnit 5的用户来说,Powermock不是一个选项。如果您只想使用Mockito成功地模拟静态方法,则需要以下依赖项。
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.6.0'
testCompile group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.6.0'
testCompile group: 'org.mockito', name: 'mockito-inline', version: '3.6.0'
mockito-junit-jupiter
支持 JUnit 5。
而对于模拟静态方法的支持由 mockito-inline
依赖提供。
示例:
@Test
void returnUtilTest() {
assertEquals("foo", UtilClass.staticMethod("foo"));
try (MockedStatic<UtilClass> classMock = mockStatic(UtilClass.class)) {
classMock.when(() -> UtilClass.staticMethod("foo")).thenReturn("bar");
assertEquals("bar", UtilClass.staticMethod("foo"));
}
assertEquals("foo", UtilClass.staticMethod("foo"));
}
try-with-resource 块用于使静态模拟仅在该范围内保持临时。
如果不使用 try 块,请确保在断言完成后关闭模拟。
MockedStatic<UtilClass> classMock = mockStatic(UtilClass.class)
classMock.when(() -> UtilClass.staticMethod("foo")).thenReturn("bar")
assertEquals("bar", UtilClass.staticMethod("foo"))
classMock.close()
模拟void方法:
当在类上调用mockStatic
时,该类中所有的静态void方法都会自动模拟为doNothing()
。
final
类/方法或新创建对象的支持)是实现模拟所采用的方法自然而然产生的(但并非预期的)结果;该方法会动态创建新类以实现/扩展要进行模拟的类型。其他模拟库使用避免这些限制的其他方法。.NET世界中也发生了类似情况。 - Rogério