我有这样的问题
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间谍,我可以执行类似的操作来确保对除法的调用。
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构造和mockStatic,也对此进行了检查mockito verify method call inside method,但是在我的情况下,对象内部调用的方法是静态的。
答案 0 :(得分:1)
您是正确的verifyStatic
没有任何方法来检查正在调用的方法。
但是有一种解决方法。看看这是否适合您。
模拟静态方法的方法是使用
PowerMockito.mockStatic(ErrorLog.class)
但是您也可以使用其他变体
PowerMockito.mockStatic(ErrorLog.class, invocationOnMock -> {
assertEquals("something", invocationOnMock.getArgumentAt(0, String.class));
return null;
});
ErrorLog.increment("something");
如果不模拟ErrorLog类,则无法验证
答案 1 :(得分:1)
你是对的。 如果您使用静态方法,则会遇到测试和依赖项注入的问题,这是一种情况。
您应该在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());
答案 2 :(得分:0)
感谢您的回应,它为我指明了正确的方向。对我起作用的是(我正在使用TestNG框架)。
paths.close()