在测试应用程序和嵌入式tomcat之间共享spring容器

时间:2013-04-11 23:01:44

标签: spring spring-test cucumber-jvm embedded-tomcat-7

我们正在使用cucumber-jvm在我们的应用程序中编写集成测试层。我们发现的挑战之一是在测试和Web应用程序之间管理数据库。

典型的情况是,我们希望在场景的给定步骤中持久化某些实体,然后在用户界面上执行某些操作,这些操作可能反过来支持更多实体。最后,我们要清理数据库。因为cucumber-jvm测试在一个jvm中并且web应用程序在另一个jvm中运行,所以我们无法共享事务(至少以我所知的方式),因此必须手动清理数据库。

我最初的想法是在与cucumber-jvm测试相同的JVM中使用嵌入式内存数据库(HSQLDB)运行的嵌入式Tomcat服务器。通过这种方式,我们可以共享一个弹簧容器,并且可以扩展一个事务,从中可以检索所有对象。

在我的初始测试期间,看起来Spring加载并配置了两次:一次是测试开始并且读取了cucumber.xml,第二次是嵌入式tomcat启动而web应用程序读取了applicationContext.xml。它们似乎位于两个完全独立的容器中,因为如果我尝试解析另一个容器中指定的一个容器中的对象,则它无法解析。如果我复制我的配置,那么我会得到关于具有相同id的重复bean的错误。

有没有办法告诉Spring为我的测试应用程序和嵌入式tomcat使用相同的容器?

我正在使用Spring 3.2.2.GA和Embedded Tomcat 7.0.39(两个库的最新版本)。

我疯了吗?我需要提供更多技术细节吗?如果我使用一些不正确的术语,请道歉。

由于

P.S。如果我的问题看起来很熟悉,你可以为我正在尝试的问题提出另一种解决方案,请告诉我!

2 个答案:

答案 0 :(得分:1)

杰夫,

弹簧加载两次是正常的。有两个地方创建了两个弹簧上下文:

  1. 在web.xml中配置的servlet容器侦听器org.springframework.web.context.ContextLoaderListener中。这个从context-param contextConfigLocation设置的文件中读取其配置。
  2. 在cucumber-spring插件cucumber.runtime.java.spring.SpringFactory提供的ObjectFactory的实现中。这个从cucumber.xml读取它的配置。
  3. 两个春天的背景完全不同,他们的实例保存在两个不同的地方。作为前者的servlet上下文属性,由JavaBackend为后者保存。

    当启动嵌入式tomcat时,可​​以访问servlet上下文,从而设置自己使用bt tomcat的spring上下文和来自cucumber的一个。但是,spring为servlet容器中使用的上下文提供了一个名为WebApplicationContext的特殊类。另一方面,黄瓜SpringFactory通过ClassPathXmlApplicationContext创建其上下文。因此,除非有办法从xml配置中指定应用程序上下文的类型,否则我们必须提供一个射出WebApplicationContext的ObjectFactory。

答案 1 :(得分:0)

我们可以做的是拥有两个web.xml。一个用于正常,一个用于测试。对于测试,我们使用我们的Context Loader监听器版本。