我有一个支持 Spring 的 JUnit 测试。它加载我的默认 applicationContext。 现在我想为我的测试替换单个 bean,即 entityManager 和 testEntityManager。
我可以想象三种可能的方式,这看起来不太优雅:
- 拆分上下文(defaultContext、emContext)并通过测试上下文文件(测试资源中的 emContext)覆盖上下文文件
- 使用工厂并选择 testEntityManager(在生产代码中)
- 不使用 Spring,而是自己构建对象层次结构(最不可行的解决方案)
是否有最佳做法正确?
这个问题的背景是:我真的只想替换靠近边界的对象(数据库、Web 服务等)
此致
编辑:我现在已经这样解决了: 我向我的类路径和测试类路径添加了一个属性文件,并将 Spring 别名与属性占位符结合使用。 通过这种方式,我能够将我的 bean 连接到测试中的不同实现。
最佳答案
当您从多个位置加载上下文时,Spring 允许您覆盖 bean 定义。
因此您不一定需要拆分上下文“/applicationContext.xml”。 取而代之的是有一个额外的应用程序上下文用于测试“/applicationContext-test.xml”,您可以在其中覆盖所需的 bean。 然后拉入两个配置并让测试配置中的 bean 覆盖生产配置中的 bean。
@ContextConfiguration({"/applicationContext.xml", "/applicationContext-test.xml"})
关于java - 在 JUnit 测试中更改 Spring 实现对象的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12054072/