0

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

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

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

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

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

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

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

谢谢

ps 如果您对我的问题很熟悉,并且您可以建议我正在尝试的解决方案的替代解决方案,请告诉我!

4

2 回答 2

1

杰夫,

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

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

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

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

于 2013-04-13T06:45:31.933 回答
0

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

于 2013-04-14T01:56:14.323 回答