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 在JUnit测试中更改Spring实现对象的最佳实践_Java_Spring_Junit - Fatal编程技术网

Java 在JUnit测试中更改Spring实现对象的最佳实践

Java 在JUnit测试中更改Spring实现对象的最佳实践,java,spring,junit,Java,Spring,Junit,我有一个支持Spring的JUnit测试。它加载默认的applicationContext。 现在我想为我的测试替换一个bean,即用testEntityManager替换entityManager 我可以想象三种可能的方式,它们看起来并不优雅: 拆分上下文(defaultContext,emContext)并按测试上下文文件(测试资源中的emContext)覆盖上下文文件 使用factory并选择testEntityManager(在生产代码中) 不使用Spring,而是自己构建对象层次结构(

我有一个支持Spring的JUnit测试。它加载默认的applicationContext。 现在我想为我的测试替换一个bean,即用testEntityManager替换entityManager

我可以想象三种可能的方式,它们看起来并不优雅:

  • 拆分上下文(defaultContext,emContext)并按测试上下文文件(测试资源中的emContext)覆盖上下文文件
  • 使用factory并选择testEntityManager(在生产代码中)
  • 不使用Spring,而是自己构建对象层次结构(最不可行的解决方案)
  • 是否有一个最佳实践,如何正确操作

    这个问题的背景是:我真的只想替换边界附近的对象(DB、Webservices等)

    您诚挚的

    编辑:我现在已经这样解决了: 我在类路径和测试类路径中添加了一个属性文件,并将Spring别名与属性占位符结合使用。
    通过这种方式,我可以在测试中将bean连接到不同的实现。

    当您从多个位置加载上下文时,Spring允许您覆盖bean定义

    因此,您不必拆分上下文“/applicationContext.xml”。 而是为test“/applicationContext test.xml”提供一个附加的应用程序上下文,在这里覆盖所需的bean。 然后拉入这两个配置,让测试配置中的bean覆盖生产配置中的bean

    @ContextConfiguration({"/applicationContext.xml", "/applicationContext-test.xml"})
    

    最好的做法是使用弹簧。我的文档链接将引导您找到其他可读资源。谷歌还将提供有用的链接,如。

    如果你找到了一个解决方案,你应该将其作为答案插入,并将此答案标记为已接受(这样就可以看到问题已解决)。如果答案提供了一个很好的解决方案,你甚至会被选中!在这种情况下,如何重写bean?我的测试有一个@Service注释(类似于@Bean),与原始Bean同名,但它没有覆盖。(冲突BeanDefinitionException)