gpt4 book ai didi

java - 在@Rule 之前通过@Mock 初始化模拟

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:27 25 4
gpt4 key购买 nike

我有一个测试类,它正在测试 Dropwizard 资源并使用 JUnit 测试规则 ResourceTestRule .它设置了许多模拟,我想替换这个成语:

Foo foo = mock(Foo.class);

这个有点冗长

@Mock Foo foo;

但是 Dropwizard ResourceTestRule需要像这样引用这些模拟

@Rule
public ResourceTestRule resources = ResourceTestRule.builder()
.addResource(new BarResource(foo))
.build();

我的问题是 @Rule@Mock 之前运行初始化模拟,所以 fooBarResource 时为空被实例化,然后我在测试运行时遇到空指针异常。

这是一个没有使用 Dropwizard 的最小示例来演示该问题:

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.model.Statement;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class TestTest {
@Mock String foo;

@Rule
public TestRule testRule = new TestRule() {
{
assert foo != null; // <<< this assertions fails
}

@Override
public Statement apply(Statement statement, Description description) {
return statement;
}
};

@Test
public void test() {

}
}

如果我可以控制 @Mock 之间的顺序和 @Rule我可以避免这个问题。或许还有其他我没有想到的选择。

感谢任何建议,谢谢!

最佳答案

这不是@Rule注解的问题,而是测试类成员变量初始化的问题。规则实例(resourcestestRule)将在创建测试实例时被初始化。即使没有附加 @Rule 注解也会发生这种情况(这是简单的 java 逻辑:构造对象实例时,将在构造期间初始化其所有成员变量)。

因此,当 Mockito 创建 foo mock 时,resourcestestRule 已经创建。如果您改为使用 MockitoRule,此行为不会改变。而 @Rule 注解只是告诉 JUnit 使用创建的对象作为规则,它并不控制规则的创建。

所以我想唯一的解决方案确实是在测试初始化​​期间也创建 foo mock,即 Foo foo = mock(Foo.class)

关于java - 在@Rule 之前通过@Mock 初始化模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49079019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com