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