【问题标题】:Share spring container between test application and embedded tomcat在测试应用程序和嵌入式tomcat之间共享spring容器
【发布时间】:2013-04-04 07:55:57
【问题描述】:

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

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

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

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

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

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

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

谢谢

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我领先你一步。看到这个问题stackoverflow.com/q/15988578/61344
    • 但是如果我们在构建级别解决 web.xml 问题呢?我们可以使用 target/webapp 来代替从 src/webapp 加载 tomcat,在其中复制了正确的 web.xml。
    • 这是一个有趣的想法!不过,我实际上今天已经开始工作了。我刚刚以编程方式配置了 web.xml。我明天可以给你看。从沙箱中获取打包的解决方案并将其应用到主代码库应该不会太难。
    【解决方案2】:

    杰夫,

    弹簧加载两次是正常的。有两个地方创建了两个 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 配置中指定应用程序上下文的类型,否则我们将不得不提供一个 ObjectFactory 来拍摄 WebApplicationContext。

    【讨论】:

    • 我确实找到了一个近似于我们需要的答案。您可以为 WebApplicationContext 设置父上下文,这可以是 ClassPathXmlApplicationContext。看到这个答案:stackoverflow.com/questions/14608373/…
    • 另一个后续问题:如果我们可以在 web 应用程序中使用 cucumber-spring 的父上下文,那么我们希望在 cucumber 中定义我们所有的服务、数据源、事务等。 xml 用于测试,但在正常启动服务器时从 web.xml 定义它们。我们怎么能这样做?
    猜你喜欢
    • 2018-06-25
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2012-02-25
    • 2011-09-10
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多