Java 弹簧-在负载测试或主配置之间切换
我正在尝试交换应用程序上下文文件,以便可以在IDE中使用真实文件进行测试,或者在IDE中使用JUnit和测试文件进行测试 一个简单的例子是: mainConfig.xmlJava 弹簧-在负载测试或主配置之间切换,java,spring,Java,Spring,我正在尝试交换应用程序上下文文件,以便可以在IDE中使用真实文件进行测试,或者在IDE中使用JUnit和测试文件进行测试 一个简单的例子是: mainConfig.xml <context:component-scan base-package="myPackage" /> <bean id="myBean" class="my.class"/> <context:component-scan base-package="myPackage" /> <
<context:component-scan base-package="myPackage" />
<bean id="myBean" class="my.class"/>
<context:component-scan base-package="myPackage" />
<bean id="myBean" class="my.test.class"/>
当我运行JUnit测试时,它将加载testConfig.xml(由于JUnit文件中的@ContextConfiguration),但它也将加载mainConfig.xml(因为ClassPathXmlApplication)。这将导致冲突,因为这两个文件不同
在不会出现这种不匹配的情况下,将所有这些连接起来的正确方法是什么?您应该认真研究使用Maven和JavaConfig。使用XML文件是2000样式,您需要更新您的样式以适应时代。看看JavaConfig和Maven,这将很容易做到 考虑到加载spring上下文和访问bean的方式,您似乎有一个特定的场景 针对您的特定问题的解决方案:
- 类路径优先级。
将
和main.xml
文件放在不同的目录中,但两者使用相同的名称(例如test.xml
和main/config.xml
)。然后配置IDE,以便在运行jUnit时,测试目录优先于类路径中的主目录 这实际上是默认情况下使用test/config.xml
得到的结果。在这种情况下,您可能需要通过使用IDE自己制作它maven
- 环境变量。
另一个选项是一个环境变量,用于配置
的位置,然后在config.xml
中使用该值,可能默认为MyLoader
,以避免在正常执行中进行额外配置main.xml
然后,您可以将IDE配置为在运行jUnit时设置该环境变量,或者从相应设置变量的基类扩展测试:public MyLoader(){ context = new ClassPathXmlApplicationContext( System.getProperty("config.location", "classpath:path/to/mainConfig.xml"));
您在这里并不真正需要SpringJUnit4ClassRunner,因为使用MyLoader,您无论如何都是在惰性地加载上下文System.setProperty("config.location", "classpath:/path/to/testConfig.xml")
MyLoader
,不要使用单例来保留spring上下文和/或检索bean
在应用程序的入口点初始化ClassPathXmlApplicationContext
,然后在获得第一个bean/s后,就不再需要ApplicationContext
对于组件之间的依赖关系,请使用适当的自动布线/注入。而不是从MyLoader
中检索它们
这是假设它是非web应用程序,对于web应用程序,请使用ContextLoaderListener
加载配置xml
遵循此方法后,您应该不会在使用SpringJUnit4ClassRunner
加载不同的config.xml时遇到任何问题,因为您在运行测试时不是从入口点运行应用程序
而且,您不会让
MyLoader
在每次需要spring组件时都尝试延迟加载主上下文。您是否在使用maven?不,我通常不使用Mavenus,不需要每次都创建appContext。您可以在启动时创建一次,并将其存储在某个位置,例如静态变量中。spring有接口ApplicationContextAware,检查这个问题:这就是我目前正在做的,但是我在java文件中仍然有一个到mainConfig的硬编码引用。XML文件是用户配置所必需的,因此是必需的。这仍然不能直接解决手头的问题。谢谢你的建议!我可能不得不选择第一个选项,因为重构在我的特定情况下没有太大意义(我只想在一个地方定义上下文的多个入口点)。
public MyLoader(){
context = new ClassPathXmlApplicationContext(
System.getProperty("config.location", "classpath:path/to/mainConfig.xml"));
System.setProperty("config.location", "classpath:/path/to/testConfig.xml")