多级测试类层次结构中的 Spring @ContextHierarchy(使用 Scala 和 ScalaTest)
Posted
技术标签:
【中文标题】多级测试类层次结构中的 Spring @ContextHierarchy(使用 Scala 和 ScalaTest)【英文标题】:Spring @ContextHierarchy in a multilevel test class hierarchy (using Scala and ScalaTest) 【发布时间】:2015-01-28 14:36:12 【问题描述】:与其拥有几个完整的应用程序上下文、复制和粘贴 99% 的内容并仅添加/删除上下文应该不同的几行,我宁愿将所有通用的东西放在一个父上下文中,即“rootContext.xml ”。其他所有内容都将成为子上下文的一部分,要么合并到父上下文中,要么替换它。
[1] 描述了设置@ContextHierarchy 和使用单元测试类层次结构所需的一切。但它不起作用。
首先是我的类层次结构:
@RunWith(classOf[JUnitRunner])
@ContextHierarchy(value = Array(new ContextConfiguration(locations = Array("classpath:/rootTestContext.xml"), name = "root")))
class TestBase extends FunSuite ...
@ContextHierarchy(value = Array(new ContextConfiguration(locations = Array("classpath:/persistenceTestContext.xml"), name = "root", ???inheritLocations = false???)))
class PersistenceTestBase extends TestBase ...
class BasicTest extends TestBase
test("blah") ...
class NeedsExtraContextForPersistenceTest extends PersistenceTestBase
test("persist!") ...
Spring 应用程序上下文文件:
rootTestContext.xml:
<import resource="classpath:/configfiles/spring/genericCaching.xml"/>
<context:annotation-config/>
<context:component-scan base-package="my.package.cm" />
<context:component-scan base-package="my.package.package2.cm" />
persistenceTestContext.xml:
<import resource="classpath:/configfiles/spring/persistence.xml"/>
所以 persistenceTestContext.xml 应该在 parentContext 中添加一行。过去存在的通用内容现在位于 rootTestContect.xml 中。但是,在运行 NeedsExtraContextForPersistenceTest 时,spring 的组件扫描器不会拾取 spring bean 进行自动装配。似乎父上下文中定义的扫描仪没有效果。为了清楚起见,使用标准方式(通过@ContextConfiguration)和完整的persistenceTestContext.xml(包括扫描仪配置)运行测试没有问题
由于只有少数示例使用 @ContextHierarchy 的测试层次结构,而没有使用 Scala + ScalaTest 的示例,如果您能提供一些见解,我会很高兴。
[1]http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#testcontext-ctx-management-ctx-hierarchies
【问题讨论】:
【参考方案1】:这些注解由 Spring JUnit runner @RunWith(SpringJUnit4ClassRunner.class)
处理;如果您编写标准的junit测试(在scala中)并使用该运行器,那么它应该可以工作。如果您想将 scalatest 与这个 spring 的东西一起使用,您可能需要编写自己的运行程序来调用 spring 运行程序会做的事情和 scalatest 运行程序会做的事情。
【讨论】:
感谢 lmm,但 ScalaTest 附带的 JUnitRunner 确实在 Spring 之上运行。请查看***.com/questions/6282471/…。我只需要将“new TestContextManager(this.getClass()).prepareTestInstance(this)”添加到基类中即可。所以原则上他们确实会同意。正如我所说,当我将@ConfigurationContext 引入混合时,问题就开始了。所以也许还有办法完成这项工作(无需重新实施跑步者)以上是关于多级测试类层次结构中的 Spring @ContextHierarchy(使用 Scala 和 ScalaTest)的主要内容,如果未能解决你的问题,请参考以下文章
使用Django ORM查询如何注释是不是存在多级外键层次结构