在junittesting类中重用spring应用程序上下文

我们有一堆JUnittesting用例(集成testing),它们在逻辑上被分组到不同的testing类中。

我们能够为每个testing类加载一次Spring应用程序上下文,并将其重用于JUnittesting类中的所有testing用例,如http://static.springsource.org/spring/docs/current/spring-framework-reference /html/testing.html

然而,我们只是想知道是否有一种方法只为一堆JUnittesting类加载Spring应用程序上下文。

FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven来构build项目。

是的,这是完全可能的。 您所要做的就是在您的testing类中使用相同的locations属性:

 @ContextConfiguration(locations = "classpath:test-context.xml") 

Spring通过locations属性caching应用上下文,所以如果第二次出现相同的locations ,Spring使用相同的上下文,而不是创build一个新的。

我写了一篇关于这个特性的文章: 加速Spring集成testing 。 另外它在Spring文档中有详细描述: 9.3.2.1上下文pipe理和caching 。

这有一个有趣的含义。 因为Spring不知道JUnit何时完成,所以它永远caching所有上下文,并使用JVMclosures挂钩closures它们。 这种行为(特别是当你有很多testing类与不同的locations )可能会导致过度的内存使用,内存泄漏等caching上下文的另一个优势。

添加到Tomasz Nurkiewicz的答案 ,从Spring 3.2.2 @ContextHierarchy可以使用@ContextHierarchy注解来分离,关联多个上下文结构。 当多个testing类想要共享(例如)内存数据库设置(数据源,EntityManagerFactory,txpipe理器等)时,这是有帮助的。

例如:

 @ContextHierarchy({ @ContextConfiguration("/test-db-setup-context.xml"), @ContextConfiguration("FirstTest-context.xml") }) @RunWith(SpringJUnit4ClassRunner.class) public class FirstTest { ... } @ContextHierarchy({ @ContextConfiguration("/test-db-setup-context.xml"), @ContextConfiguration("SecondTest-context.xml") }) @RunWith(SpringJUnit4ClassRunner.class) public class SecondTest { ... } 

通过这个设置,使用“test-db-setup-context.xml”的上下文将只被创build一次,但是它里面的bean可以被注入到单个unit testing的上下文中

更多关于手册: http : //docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (search“ 上下文层次结构 ”)