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

问题描述 投票:0回答:1

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

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(异常);

如何测试这个?

junit mockito spring-test powermockito
1个回答
0
投票

static {}
初始化块只执行一次——当 class(不是实例)第一次初始化时。一个类只加载一次,并在 JVM 进程的整个持续时间内保留。

即使是多个测试班也不会对你有太大帮助。如果要测试静态初始化程序块的不同行为,则需要分叉一个单独的 JVM 进程。 (也许你可以用自定义类加载器解决这个问题?我不知道)

© www.soinside.com 2019 - 2024. All rights reserved.