在集成测试中自动装配JUnit规则

时间:2017-07-15 23:50:01

标签: spring junit autowired spring-test junit-rule

我有一段代码将在多个集成测试中重复。代码将在测试之前和之后运行。我已经决定使用JUnit @Rule将是实现这一目标的最佳方式。

问题是该规则需要访问少量@Autowired Spring bean。 (测试使用Spring Integration Test Runner运行,因此Autowire工作正常。

我有一条规则:

public class CustomSpringRule extends ExternalResource {
    private final SomeOtherBean someOtherBean;

    public CustomSpringRule(SomeOtherBean someOtherBean) {
        this.someOtherBean = someOtherBean;
    }

    @Override
    public void before() {
        someOtherBean.someMethod();
    }

    // ...
}

我有我添加了我的bean的上下文:

@Bean 
public CustomSpringRule getCustomSpringRule(SomeOtherBean someOtherBean) {
   return new CustomSpringRule(someOtherBean);
}

最后,我刚刚在测试文件中自动连接了规则bean:

@Autowire
@Rule
public CustomSpringRule customSpringRule;

一切正常但我从未真正使用过@Rule注释,我有点担心JUnit反射和Spring Autowire不能很好地结合在一起,或者会出现一些初看起来不明显的问题。

有人有任何建议是否有效且安全吗?

2 个答案:

答案 0 :(得分:0)

我认为你不需要@Rule,

  

“我有一段代码会在多个代码中重复出现   集成测试。代码将在测试之前和之后运行。“

这可以使用JUnit的@Before和@After注释来实现。使用这些注释注释的方法将在每次测试之前/之后执行。所以你可以用这些方法调用你的公共代码。

答案 1 :(得分:0)

使用自动连接规则很好-这种方法没有问题或限制。

注意:我正在使用组件扫描(例如在@SpringBootTest中启用),可以像这样简化规则的实现:

@Component
public class CustomSpringRule extends ExternalResource {
    @Autowired
    private SomeOtherBean someOtherBean;

    @Override
    public void before() {
        someOtherBean.someMethod();
    }

    // ...
}