mockito 测试第一个调用成功,第二个调用失败,whenNew

djmepvbi  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(332)

我有一个静态变量,并在静态块中初始化。

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);
如何测试这一点?

dy1byipe

dy1byipe1#

static {}初始化器块只执行一次-当 class(不是示例)首次初始化时。一个类只加载一次,并在JVM进程的整个持续时间内保持。
即使是多个测试类也不会对您有多大帮助。如果你想测试一个静态初始化器块的不同行为,你需要派生一个单独的JVM进程。(也许你可以用一个自定义的类加载器来解决这个问题?I don't know)

相关问题