如何为Spring测试创建TestContext?

2024-05-05

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

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

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

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

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

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

当我从 Eclipse 中运行测试时,它错误地显示“无法加载应用程序上下文”......当然。

Update:

这是测试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)

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

I said 大部分情况下上面是因为我至少想到了一个例外。通常,您的应用程序将使用 JNDI 来定位数据源,但在集成测试(至少是容器外集成测试)中,您通常不会有可用的 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 时,它会复制contents of the resources目录到你的类路径中,而不是resources本身。那应该有帮助。

EDIT:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为Spring测试创建TestContext? 的相关文章

随机推荐

  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 在主表单之前显示登录表单

    我在表单之间导航时遇到问题 我使用 Delphi XE5 创建了一个 Android Firemonkey 移动应用程序 我目前有一个登录表单和主表单 现在我想要有关如何处理登录表单以显示在主表单之前的建议 在 项目选项 中的表单下 选择要
  • Rails 3:# 的未定义方法“page”

    我无法克服这一点 我知道我读过没有数组的页面方法 但我该怎么办 如果我在控制台中运行 Class all 它会返回 但如果我运行 Class all page 1 则会收到上述错误 有任何想法吗 没有数组没有页面方法 看起来你正在使用kam
  • 用 ruby​​ 解决旅行商问题(50 多个位置)

    我在一家快递公司工作 目前 我们 手动 解决了 50 多个地点的路线 我一直在考虑使用 Google Maps API 来解决这个问题 但我读到有 24 点的限制 目前我们在服务器中使用 Rails 因此我正在考虑使用 ruby 脚本来获取
  • 删除 hive 表中的列

    我正在使用 hive 版本 0 9 我需要删除 hive 表的列 我在几个 hive 命令手册中进行了搜索 但我只找到了 0 14 版本的命令 在 hive 0 9 版本中可以删除 hive 表的一列吗 命令是什么 谢谢 我们不能简单地使用
  • Android 多用户支持(4.2 中的新功能)对服务器端数据模型(例如 android_id)的影响

    Google 刚刚发布了 Android 4 2 其中支持单个设备上的多个用户配置文件 http developer android com about versions android 4 2 html MultipleUsers htt
  • 始终启动没有历史记录的新活动实例

    有没有办法将活动作为没有历史记录的新实例启动 在清单文件中尝试了以下内容 android launchmode singleinstance android noHistory true 我能够实现我所需要的 但是一旦屏幕锁定 就会显示之前
  • SQL 连接表

    表一包含 ID Name 1 Mary 2 John 表二包含 ID Color 1 Red 2 Blue 2 Green 2 Black 我想结束的是 ID Name Red Blue Green Black 1 Mary Y Y 2 J
  • 将 2D 数组中的每一列与另一个 2D 数组中的每一列相乘

    我有两个 Numpy 数组x有形状 m i and y有形状 m j 所以行数是相同的 我想将每一列相乘x每一列y逐元素 使结果具有形状 m i j Example import numpy as np np random seed 1 x
  • SoapHttpClientProtocol:以流而不是字符串的形式获取响应?

    我正在使用一种网络服务 它可以一次性输出大量数据 响应字符串可能约为 8MB 虽然在台式电脑上这不是问题 但嵌入式设备在处理 8MB 字符串对象时会发疯 我想知道是否有办法以流的形式获取响应 目前我正在使用如下方法 我尝试使用 POST 请
  • 从 BLOB 打印 PDF

    我从外部 API 获取 PDF 文件 使用此代码我可以正确下载该文件 var req new XMLHttpRequest req open POST url true req responseType blob req setReques
  • 对话框结果 WPF

    我正在读一本书 上面写着 而不是设置 DialogResult 用户点击后手动 按钮 您可以将按钮指定为 接受按钮 通过设置 是默认为true 点击那个 按钮自动设置 窗口的DialogResult为true 同样 你可以指定一个按钮 作为
  • 如何在 python pandas 中的同一列上进行分组并将唯一值的计数和某些值的计数作为聚合?

    我的问题与我之前的问题有关Question https stackoverflow com questions 42022767 how to do group by and take count of one column divide
  • 使用 std::set 时重载运算符<

    这是我第一次使用 std set 容器 并且我对操作符 std less 遇到了问题 我声明该集合 std set
  • Mongoose MongoDB:更新嵌套数组中的对象

    我有以下架构 var UserSchema new Schema emp no Number skills skill type Schema Types ObjectId ref Skill startDate type Date 然后我
  • 使用 JavaScript 在空闲时隐藏鼠标光标

    是否可以使用JavaScript来设置cursor属性的属性none如果鼠标在一定时间内处于非活动状态 例如五秒 请将其设置回auto当它再次活跃时 EDIT 我意识到none不是有效值cursor财产 尽管如此 许多网络浏览器似乎都支持它
  • 领域驱动设计:处理原子操作和事务

    必须保证每个聚合内部的一致性 在存储库中执行此操作很容易 因为我始终可以使用数据库或框架中的事务 我对存储库之外发生的事情表示怀疑 一项服务可能需要使用多个聚合来处理请求 在服务处理过程中或在保留聚合时可能会出现问题 如果服务处理过程中出现
  • 如何生成满足某些限制的整数?

    任何人都可以帮我提供生成满足某些限制的整数的技术吗 例如 假设我需要生成整数 x 和 y 使得 100 gt x and y lt x 5 我指的并不是这个特定的示例 而是一些生成满足某些条件的整数的通用技术 嗯 这并不难 选择一个整数 可
  • 自动调整“非视网膜”图像版本的大小

    我正在寻找一种解决方案 可以使我免于维护同一图像的两个版本 一个用于视网膜显示器 又名 2x 另一个用于非视网膜显示器 我的目标是仅维护 2x 图像 并使用一些 神奇工具 只需单击一下即可调整所有图像的大小 甚至在 XCode 中构建时效果
  • 如何为Spring测试创建TestContext?

    我有一个相对较小的 Java 库 它实现了几十个 bean 没有数据库或 GUI 我创建了一个 Spring Bean 配置文件 其他 Java 项目使用该文件将我的 bean 注入到他们的东西中 我现在第一次尝试使用 Spring Tes