在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“ 上下文层次结构 ”)