我有一段代码将在多个集成测试中重复。代码将在测试之前和之后运行。我已经决定使用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不能很好地结合在一起,或者会出现一些初看起来不明显的问题。
有人有任何建议是否有效且安全吗?
答案 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();
}
// ...
}