我有一个静态变量,并在静态块中初始化。
private EnvironmentInfo environmentInfo;
static {
try {
apolloEnvironmentInfo = new EnvironmentInfo();
} catch (IOException e) {
log.warn("Error while initializing EnvironmentInfo", e);
}
}
随后在不同的方法中使用environmentInfo
。但是为了测试catch分支我想为一个测试用例抛出IOException。
尝试这种方式
public void test() throws Exception {
PowerMockito.whenNew(EnvironmentInfo.class).withAnyArguments().thenReturn(mockEnvironmentInfo);
....}
public void testWithException() throws Exception {
PowerMockito.whenNew(ApolloEnvironmentInfo.class).withNoArguments().thenThrow(new IOException("Test Exception"));
....}
不工作,因为如果test()
首先执行,testWithException()
无法覆盖返回的Exception,因此失败。另一方面,如果testWithException()
首先执行,则test()
无法使用模拟值设置返回。
为了解决这个问题-
PowerMockito.whenNew(EnvironmentInfo.class).withAnyArguments().thenReturn(mockEnvironmentInfo).thenThrow(new IOException("Test Exception"));
但它给出了错误:-
您可能存储了一个由when()返回的对OngoingStubbing的引用,并在此引用上多次调用thenReturn()等stubbing方法。正确用法示例:when(mock.isOk()).thenReturn(true).thenReturn(false).thenThrow(exception); when(mock.isOk()).thenReturn(true,false).thenThrow(exception);
如何测试这一点?
1条答案
按热度按时间dy1byipe1#
static {}
初始化器块只执行一次-当 class(不是示例)首次初始化时。一个类只加载一次,并在JVM进程的整个持续时间内保持。即使是多个测试类也不会对您有多大帮助。如果你想测试一个静态初始化器块的不同行为,你需要派生一个单独的JVM进程。(也许你可以用一个自定义的类加载器来解决这个问题?I don't know)