【问题标题】:How to create TestContext for Spring Test?如何为 Spring 测试创建 TestContext?
【发布时间】:2011-02-21 05:12:17
【问题描述】:

我有一个相对较小的 Java 库,它实现了几十个 bean(没有数据库或 GUI)。我创建了一个 Spring Bean 配置文件,其他 Java 项目使用它来将我的 bean 注入到他们的东西中。

我现在第一次尝试使用 Spring Test 将其中一些 bean 注入我的 junit 测试类(而不是简单地实例化它们)。

我这样做部分是为了学习 Spring Test,部分是为了强制测试使用我为其他人提供的相同 bean 配置文件。

在 Spring 文档中说我需要使用 Spring 附带的“TestContext”类创建应用程序上下文。我相信这应该在我通过测试类上的 @ContextConfiguration 注释引用的 spring XML 文件中完成。

@ContextConfiguration({"/test-applicationContext.xml"})

但是,没有提示要在文件中放入什么!

当我在 Eclipse 中运行我的测试时,它会报错说“无法加载应用程序上下文”......当然。

更新:

这里是 test-applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <description>Holds application context for testing of the domain module.</description>

    <!-- Imports the uuid generator bean definitions -->
    <import resource="resources/domain-uuid.xml"/>  
</beans>

我的项目目录是这样的:

domain/
   src/
      main/
         java/
         resources/
      test/
         java/
         resources/ (location of test-applicationContext.xml)

为了好玩,我还尝试通过“mvn clean test”从 mvn 命令行构建,但出现以下错误,这可能是我真正的问题:

package org.springframework.test.context does not exist

package org.springframework.test.context.junit4 does not exist

cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})

cannot find symbol
symbol: class SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)

【问题讨论】:

    标签: xml spring testing junit applicationcontext


    【解决方案1】:

    在应用程序上下文文件中放置什么。 TestContext 框架的工作方式是它允许您在集成测试的上下文中重用应用程序连接。所以在大多数情况下,你在应用上下文配置文件中放置的测试并没有什么特别之处。如果您的控制器在您的应用程序中具有服务 bean 依赖项,那么它也将在您的集成测试中具有该依赖项。如果您的 DAO 在您的应用程序中有一个 SessionFactory,那么您的集成测试也是如此。这样,当您编写集成测试时,您不必重新连接所有这些东西。很酷。

    我在上面说大部分是因为我想到了至少一个例外。通常,您的应用程序将使用 JNDI 来定位 DataSource,但在集成测试(至少是容器外集成测试)中,您通常不会有可用的 JNDI 环境。因此,您通常应该将 DataSource bean 创建隔离到一个单独的文件中,并为您的实时应用程序使用 JNDI 版本,并为您的集成测试使用非 JNDI 版本(例如,只需创建一个直接的BasicDataSource)。这是前者的一个例子:

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/>
    

    这是后者的一个例子:

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close"
        p:driverClassName="${dataSource.driverClassName}"
        p:url="${dataSource.url}"
        p:username="${dataSource.username}"
        p:password="${dataSource.password}" />
    

    这些将放在单独的文件中。第一个可能进入beans-datasource.xml 用于正常的应用程序使用,第二个可能进入beans-datasource-it.xml 用于集成测试。普通应用程序使用和集成测试常用的配置(即大多数情况下的绝大多数 bean 配置)应该在一个或多个通用配置文件中。

    此外,Spring 3 引入了一个新的 jdbc 命名空间,允许您创建嵌入式数据库,如 HSQLDB 数据库或 Derby 数据库等。它看起来像这样:

    <jdbc:embedded-database id="dataSource">
        <jdbc:script location="classpath:hsql/schema.sql" />
        <jdbc:script location="classpath:hsql/test-data.sql" />
    </jdbc:embedded-database>
    

    如果你想使用它,那将替换上面描述的 BasicDataSource 配置。

    为什么会发生错误。您看到的错误是因为您的 @ContextConfiguration 值隐含地表明应用上下文文件应该在类路径中。 重要提示:删除/resources 部分。那是Maven的内脏;当它构建你的 JAR 或 WAR 时,它会将resources 目录的内容 复制到你的类路径中,而不是resources 本身。这应该会有所帮助。

    编辑:

    要解决“未找到符号”错误,您需要将测试依赖项添加到 Maven POM。这将是 JUnit 和 Spring Test 模块,两者都带有&lt;scope&gt;test&lt;/scope&gt;。此外,如果您使用像 Mockito 这样的模拟框架,您还需要将该依赖项(带有测试范围)添加到您的 POM 中。尝试一下,然后报告发生的情况。

    【讨论】:

    • 抱歉——我没有使用 JNDI 或 DAO。我只是不知道在哪里创建 textContext!你说“应用上下文文件”——那是什么?
    • “应用上下文文件”只是您的 Spring 配置 XML 文件。具有顶级 元素的那个。您可以将其直接放在 WEB-INF 下,也可以将其放在类路径中,就像您在其他 cmets 中所说的那样放在 src/test/resource 下。将目录结构(相关部分)添加到原始帖子中并显示 test-applicationContext.xml 文件包含的内容可能会对您有所帮助。
    • 好的——我想我明白了。我不必在任何地方指定 TestContext。春天只是以某种方式“知道”(如何???)。问题是Spring找不到我的配置文件。
    • 正确,Spring 将负责 TestContext 部分。开发人员通常根本不必乱用 TestContext。它正是测试框架用来管理有关测试用例(由您的测试类实现)和当前正在运行的测试(由您的测试方法实现)的上下文信息。因此,例如,如果您在测试方法上有 @DirtiesContext 注释,那么框架会将应用程序上下文(即您的 bean 容器)标记为脏,以便在运行测试后重新加载它。
    【解决方案2】:

    要直接在src/test/resources下找到,改成:

    @ContextConfiguration({"classpath:/test-applicationContext.xml"})
    

    当您没有指定任何内容时,Spring 在与测试类相同的包中搜索。

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2013-07-11
      • 2021-10-17
      • 1970-01-01
      相关资源
      最近更新 更多