我有这样的问题
public class ErrorLog {
public static void increment(String exception) {
// do something
}
}
import ErrorLog;
public class Calculator {
public int division(int a, int b) {
if (b == 0) {
ErrorLog.increment("Divide by Zero");
} else {
return a / b;
}
}
}
我想验证除法的调用次数,但是当我被零除的情况下,以某种方式验证是否调用了静态方法ErrorLog.increment(使用确切的字符串作为参数)。
使用Mockito间谍,我可以执行类似的操作来确保对divide方法的调用。
Calculator c = new Calculator();
Calculator calcSpy = spy(c);
c.division(6, 3);
c.division(1, 0);
verify(calcSpy, times(2)).division(anyInt(), anyInt());
我也很想验证这样的东西
verify(ErrorLog, times(1)).increment("Divide by Zero");
[我研究了PowerMockito verifyStatic构造和模拟状态,也对此进行了检查mockito verify method call inside method,但在我的情况下,对象内部调用的方法是静态的。
您是正确的verifyStatic
没有任何方法可以检查正在调用的方法。
但是有一种解决方法。看看是否适合您。
模拟静态方法的方法是使用
PowerMockito.mockStatic(ErrorLog.class)
但是您也可以使用其他变体
PowerMockito.mockStatic(ErrorLog.class, invocationOnMock -> {
assertEquals("something", invocationOnMock.getArgumentAt(0, String.class));
return null;
});
ErrorLog.increment("something");
如果不模拟ErrorLog类,则无法验证
您是对的。如果您使用静态方法,则测试和依赖项注入会遇到问题,这是一种情况。
您应该以Singleton形式转换ErrorLog,然后可以通过间谍对其进行验证。例如:
public class ErrorLog {
private static ErrorLog = new ErrorLog();
public static ErrorLog getInstance() {
return errorLog;
}
public void increment(String exception) {
// do something
}
}
import ErrorLog;
public class Calculator {
public int division(int a, int b) {
if (b == 0) {
ErrorLog.getInstance()increment("Divide by Zero");
} else {
return a / b;
}
}
}
至此,您可以使用以下代码片段测试调用:
ErrorLog errorLog = ErrorLog.getInstance();
ErrorLog errorLogSpy = spy(errorLog);
verify(errorLogSpy , times(1)).increment(any());