SpringBootTest:如何知道启动应用程序何时完成

时间:2017-02-14 15:55:11

标签: spring spring-boot spring-test qpid

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。

2 个答案:

答案 0 :(得分:2)

Spring Boot集成测试可以配置监听ContextClosedEventApplicationListener。在测试类中定义嵌套的@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()
}

关于stop method

的Spring文档
  

通常以同步方式停止此组件,以便   返回此方法后,组件完全停止。

JUnit AfterClass带注释的方法必须是静态的,因此@Autowired与setContext方法一起使用。