Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧-在负载测试或主配置之间切换_Java_Spring - Fatal编程技术网

Java 弹簧-在负载测试或主配置之间切换

Java 弹簧-在负载测试或主配置之间切换,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" /> <

我正在尝试交换应用程序上下文文件,以便可以在IDE中使用真实文件进行测试,或者在IDE中使用JUnit和测试文件进行测试

一个简单的例子是:

mainConfig.xml

<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
    test/config.xml
    )。然后配置IDE,以便在运行jUnit时,测试目录优先于类路径中的主目录

    这实际上是默认情况下使用
    maven
    得到的结果。在这种情况下,您可能需要通过使用IDE自己制作它

  • 环境变量。 另一个选项是一个环境变量,用于配置
    config.xml
    的位置,然后在
    MyLoader
    中使用该值,可能默认为
    main.xml
    ,以避免在正常执行中进行额外配置

    public MyLoader(){
      context = new ClassPathXmlApplicationContext(
          System.getProperty("config.location", "classpath:path/to/mainConfig.xml"));
    
    然后,您可以将IDE配置为在运行jUnit时设置该环境变量,或者从相应设置变量的基类扩展测试:

    System.setProperty("config.location", "classpath:/path/to/testConfig.xml")
    
    您在这里并不真正需要SpringJUnit4ClassRunner,因为使用MyLoader,您无论如何都是在惰性地加载上下文

这些都不是很好的解决方案

以牺牲重构为代价的更好的解决方案: 删除
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")