Spring启动集成测试如下所示
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application)
class IntegrationTest {
static QpidRunner qpidRunner
@BeforeClass
static void init() {
qpidRunner = new QpidRunner()
qpidRunner.start()
}
@AfterClass
static void tearDown() {
qpidRunner.stop()
}
}
因此,Qpid实例之前运行并在所有测试之后彻底崩溃。我想知道有没有办法在调用qpidRunner.stop()
之前检查Spring启动应用程序是否仍在运行。我想在我确定春季应用程序已经完成停止时才停止Qpid。
答案 0 :(得分:2)
Spring Boot集成测试可以配置监听ContextClosedEvent
的ApplicationListener
。在测试类中定义嵌套的@TestConfiguration
类,以将bean添加到应用程序的主要配置中。
@TestConfiguration
static class MyConfiguration {
@Bean
public ApplicationListener<ContextClosedEvent> contextClosedEventListener() {
return event -> qpidRunner.stop();
}
}
答案 1 :(得分:0)
考虑到ConfigurableWebApplicationContext
可以注入SpringBootTest
,将这些行添加到代码中解决了问题
static ConfigurableWebApplicationContext context
@Autowired
void setContext(ConfigurableWebApplicationContext context) {
AbstractDocsIntegrationTest.context = context
}
@AfterClass
static void tearDown() {
context.stop()
qpidRunner.stop()
}
的Spring文档
通常以同步方式停止此组件,以便 返回此方法后,组件完全停止。
JUnit AfterClass
带注释的方法必须是静态的,因此@Autowired
与setContext方法一起使用。