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



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

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

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

在我最初的测试中,Spring似乎被加载和配置了两次:一次是在测试启动时读取cucumber.xml,第二次是在嵌入式tomcat启动时读取其applicationContext.xml。这些似乎在两个完全独立的容器中,因为如果我试图解析一个容器中指定的另一个容器中的对象,那么它不会解析。如果我复制我的配置,那么我得到关于具有相同id的复制bean的错误。

是否有一种方法可以告诉Spring为我的测试应用程序和嵌入式tomcat使用相同的容器?

我使用Spring 3.2.2。GA和嵌入式Tomcat 7.0.39(这两个库的最新版本)。

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

感谢

注。如果我的问题似乎熟悉你,你可以建议一个替代的解决方案,我正在尝试,请让我知道!

Jeff,

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

  1. 在servlet容器listener org.springframework.web.context.ContextLoaderListener中配置。它从上下文参数contextConfigLocation设置的文件中读取配置。
  2. 在cucumber-spring插件cucumber.runtime.java.spring.SpringFactory提供的ObjectFactory实现中。这个从cucumber.xml中读取它的配置。

两个spring上下文是完全不同的,它们的实例保存在两个不同的地方。对于前者,作为servlet上下文属性,对于后者,由JavaBackend保存。

在启动嵌入式tomcat时,可以访问servlet上下文,从而将tomcat使用的spring上下文设置为来自cucumber的spring上下文。但是,spring有一个名为WebApplicationContext的特殊类,用于servlet容器中使用的上下文。另一方面,黄瓜SpringFactory通过ClassPathXmlApplicationContext创建它的上下文。因此,除非有一种方法可以从xml配置中指定应用程序上下文的类型,否则我们将不得不提供一个ObjectFactory来拍摄WebApplicationContext。

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

最新更新