我有一个静态变量并在静态块中初始化。
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()
无法覆盖返回异常因此失败。
另一方面,如果 testWithException()
先执行,那么 test()
就无法设置返回值。
为了解决这个尝试 -
PowerMockito.whenNew(EnvironmentInfo.class).withAnyArguments().thenReturn(mockEnvironmentInfo).thenThrow(new IOException("Test Exception"));
但是它给出了错误:-
您可能存储了对 when() 返回的 OngoingStubbing 的引用,并多次在此引用上调用诸如 thenReturn() 之类的存根方法。 正确用法示例: 当(mock.isOk()).thenReturn(真).thenReturn(假).thenThrow(异常); when(mock.isOk()).thenReturn(true, false).thenThrow(异常);
如何测试这个?
static {}
初始化块只执行一次——当 class(不是实例)第一次初始化时。一个类只加载一次,并在 JVM 进程的整个持续时间内保留。
即使是多个测试班也不会对你有太大帮助。如果要测试静态初始化程序块的不同行为,则需要分叉一个单独的 JVM 进程。 (也许你可以用自定义类加载器解决这个问题?我不知道)