Spring JUnit ApplicationContextInitializer参数

时间:2014-09-04 13:09:24

标签: java spring junit environment

我们已经实现了扩展的.properties格式。这样的属性文件可以包含可选的include属性。此属性的值是要递归加载的其他属性文件的类路径。

我可以为我的应用程序配置Spring环境,但我有一个问题是将此机制与SpringJUnit4ClassRunner一起使用。

我以为我可以使用initializer注释的ContextConfiguration属性,但它看起来只能使用无参数构造函数进行实例化。

我需要为其提供属性文件层次结构的根文件。它最终可能是我的测试类的另一个注释,但同样,我如何访问它?

我到目前为止唯一的想法是将此文件设置为我的测试类静态初始化程序中的系统属性。丑:

@ActiveProfiles("qacs.controller.channels=mock")
@ContextConfiguration(initializer=ContainerTestContextInitializer.class)
public class QacsControllerTest 
{
   static
   {
      System.setProperty(ContainerTestContextInitializer.SYSTEM_PROPERTY, "classpath:com/xxx/qacs/QacsControllerTest.properties");
   }
   @Test
   void test() {}
   }
}

public class ContainerTestContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
   public static final String SYSTEM_PROPERTY = "icomp.test.properties";
   @Override
   public void initialize(ConfigurableApplicationContext pApplicationContext)
   {
      String path = System.getProperty(SYSTEM_PROPERTY);
      if (path == null)
      {
         throw new IllegalStateException("Missing system property " + SYSTEM_PROPERTY);
      }

      final DefaultPropertiesLoader loader;
      loader = new DefaultPropertiesLoader(System.getProperties());
      try
      {
         loader.load(path);
      }
      catch (IOException e)
      {
         throw new IllegalStateException(e.getMessage(), e);
      }

      MutablePropertySources sources = pApplicationContext.getEnvironment().getPropertySources();
      MapPropertySource mps = new MapPropertySource(Launcher.ICOMP_PROPERTY_SOURCE, (Map) loader.getProperties());
      sources.addFirst(mps);
   }
}

0 个答案:

没有答案