在 JUnit 规则运行之前使用 Spring TestExecutionListener 初始化状态



我想在每个 Spring Boot JUnit 测试用例之前初始化状态,并带有TestExecutionListener。此初始化需要在调用 JUnit@Rules 的相应回调之前运行。

我本来希望beforeTestMethod是正确的,因为它的JavaDoc评论说

执行底层测试框架的生命周期回调之前预处理测试

规则为测试提供"之前"回调,因此我本以为beforeTestMethod在规则之前执行。但是,调试器显示情况并非如此!


这是我的代码结构:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners(listeners = MyTestExecutionListener.class, mergeMode = MergeMode.MERGE_WITH_DEFAULTS)
public class MyTest {
@Autowired
@Rule
public MyRule rule;
@Test
public void test1() {
// ...
}
// ... more tests
}
public class MyTestExecutionListener implements TestExecutionListener {
@Override
public void beforeTestMethod(TestContext testContext) {
// ...
}
}
@Component
public class AutoLogin extends ExternalResource {
@Override
protected void before() {
// ...
}
}

我希望方法按顺序执行

  • beforeTestMethod()
  • rule.before()
  • test1()

但实际顺序是

  • rule.before()
  • beforeTestMethod()
  • test1()

知道我做错了什么,或者我应该使用哪种其他TestExecutionListener方法?

如果要在执行Rule之前初始化每个测试的状态,则应使用TestExecutionListener接口的prepareTestInstance方法。

@Override
public void prepareTestInstance(TestContext testContext) {
System.out.println("inside prepareTestInstance");
}

这样,您将按以下顺序执行方法:

  • prepareTestInstance()
  • rule.before()
  • test1()

请注意,prepareTestInstance将在每个测试方法之前执行

最新更新