多级测试类层次结构中的 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)的主要内容,如果未能解决你的问题,请参考以下文章

用于编辑具有多级节点和多个用户的层次结构的架构

Ember 数据多级层次结构始终嵌入

使用Django ORM查询如何注释是不是存在多级外键层次结构

有啥方法可以从 Eclipse 的层次结构视图中隐藏测试类?

实体框架+多级继承+EF代码优先

spring boot1.5.6 测试类