当方法退出时,如何不使弹簧启动应用程序死亡

时间:2016-08-04 16:03:19

标签: java spring spring-boot testng

我正在尝试围绕Spring Boot应用程序编写一些集成测试

我不想使用在每次测试时启动应用程序的SpringJunitRunner。这是因为我有很多测试,我不想为每个测试启动一次应用程序。此外,还有一些东西与我公司的基础架构集成在一起,第二个测试总是在启动spring应用程序时失败(因为其他一些上下文只能创建一次)

所以我的想法是使用TestNG并在套件开始时启动应用程序一次,然后针对应用程序运行测试,然后关闭应用程序

我能够启动应用程序,但在启动它的方法退出后不久就会死掉。有没有办法让应用程序生效

我创建了一个单例类来管理应用程序生命周期

  public final class IntegrationTestContext {



    private static IntegrationTestContext INSTANCE = null;

    private Boolean isInitialized = false;

    private ConfigurableApplicationContext applicationContext;

    SpringApplication app = null;

    public static synchronized IntegrationTestContext getInstance() {

      if (INSTANCE == null){
        INSTANCE = new IntegrationTestContext();      
      }

      return INSTANCE;
    }

    private IntegrationTestContext() {
      if (!isInitialized) {
        runApplication();
        isInitialized = true;
      }
    }

    public ApplicationContext getContext() {
      return applicationContext;
    }



    private PropertySourcesPlaceholderConfigurer getBeanFactoryPostProcessor(){    
      Properties properties = new Properties();
      properties.setProperty("some.companyrelated.property.1", "false");
      properties.setProperty("some.companyrelated.property.2", "false");   
      PropertySourcesPlaceholderConfigurer pph = new PropertySourcesPlaceholderConfigurer();
      pph.setProperties(properties);
      return pph;    
    }


    /**
     * This runs the application and sets the spring application context
     * that we can query to get the client beans
     */
    private void runApplication() {    
      try {

        final String[] args = {};
        app = new SpringApplication(Application.class, ClientConfig.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.addInitializers(new MyCompanyInitializer());
        applicationContext = app.run(args);
        applicationContext.addBeanFactoryPostProcessor(getBeanFactoryPostProcessor());
        applicationContext.refresh();

      }
      catch (Exception exception) {

      }
    }


    public void shutDownApplication(){    
      try {      
        applicationContext.close();
        isInitialized = false;
        app = null;
        INSTANCE = null;
      }
      catch (Exception e) {      
      }
    }  
  }

我面临的问题是,在runApplication()方法退出之后,Spring应用程序就会死掉。

可以做些什么来完成这项工作?将在新流程中启动应用程序吗?

1 个答案:

答案 0 :(得分:1)

删除了刷新上下文的行并且它正常工作