我有一个这样的问题
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 spy,我可以这样做,以确保对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结构和mockStatic,检查了这个也是mockito verify method call inside method,但在我的例子中,在对象内部调用的方法是静态的。
发布于 2020-03-26 06:13:47
你说得对,verifyStatic没有任何方法来检查被调用的方法。
但是有一种变通方法。看看这对你是否有效。
模拟静态方法的方法是使用
PowerMockito.mockStatic(ErrorLog.class)但您也可以使用另一种变体
PowerMockito.mockStatic(ErrorLog.class, invocationOnMock -> {
assertEquals("something", invocationOnMock.getArgumentAt(0, String.class));
return null;
});
ErrorLog.increment("something");如果不模拟ErrorLog类,则无法验证
发布于 2020-03-26 06:51:46
你是正确的。如果你使用静态方法,你会在测试和依赖注入方面遇到问题,这就是一个例子。
你应该在一个单例中转换ErrorLog,然后你可以用spy来验证它。例如:
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());发布于 2020-03-26 07:23:54
感谢你的回复,它指引我走上了正确的方向。对我产生影响的事情是这样的(我使用TestNG框架)。
package com.apple.sample.powermock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
@PrepareForTest({ErrorLog.class})
public class TestStaticMethods extends PowerMockTestCase {
@Test
public void testSpy() throws Exception {
PowerMockito.mockStatic(ErrorLog.class, invocation -> {
assertEquals("Division by Zero", invocation.getArgument(0, String.class));
return null;
});
new Math().division(10, 0);
}
}https://stackoverflow.com/questions/60857325
复制相似问题