java - 使用不同的 Spring 属性进行集成测试

标签 java spring maven-2 integration-testing

我正在使用 Selenium 测试一个使用 Spring 开发的 Web 应用程序,以检查该 Web 应用程序是否为用户显示了正确的内容,以及他是否能够执行规范中规定的所有操作。

其他开发人员使用内存中的假 Hibernate 数据库 (HSQLDB) 进行单元测试。显然,我必须使用程序使用的真实数据库进行测试。 Spring 应用程序上下文的 JDBC 参数由 Spring 在运行时(或构建 WAR 文件的编译时)加载。 Spring 使用 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 找到的属性为 webapp 和测试配置应用程序上下文,并且 XML 配置文件由测试和 webapp 共享。

属性需要根据 Maven 配置文件、单元测试或集成测试而有所不同。

我尝试了几种方法,但都没有成功:

  • 使用较低级别的 SQL 查询开发我自己的 DAO。这真是浪费时间和最后的解决方案。由于外键约束和数据库模型更改,并且考虑到应用程序具有一组非常可靠(经过单元测试)的 DAO,这确实是最愚蠢的选择。
  • 使用 Maven 过滤器并在那里定义 JDBC 属性。问题是属性在主应用程序和单元测试之间共享,因为 tomcat:redeploy 目标包括单元测试。然后应用程序无法连接到真实的数据库。
  • 在不同的文件夹中具有不同的属性。 Spring 根本不关心配置文件的 Surefire 配置中定义的额外资源,无论是 testResources 还是 resources。奇怪的是,这种方法对于在主应用程序中为每个环境使用不同的 JDBC 参数非常有效。我们在 src/main/resources 中有几个文件夹,其中包含覆盖 src/main/resources 中默认属性的属性。它对 src/test/resources 的工作方式不同。我什至不知道如何找到这种行为的原因。
  • 让 Spring 根据用户定义的 Maven 参数加载不同的属性文件。相同的属性用于主应用程序和单元测试。 Spring 在找不到属性文件时也会提示(迫使我创建包含空文件的目录只是为了完成构建)。

为什么当前的构建配置,开发人员配置文件(开发人员,测试服务器...)+测试配置文件(单元测​​试)同时激活并且属性没有相互覆盖?因为 Maven 会让 Spring 在单元测试启动时查看 src/test/resources,在构建目标启动时查看 src/main/resources。不幸的是,没有像这样的集成测试的默认配置。

最佳答案

我们这样做的方法是根据变量选择属性文件,因此 spring 中的属性占位符如下所示:

<context:property-placeholder location="classpath:db.${TARGET_ENV}.properties" />

然后您可以选择将 TARGET_ENV 定义为环境变量或使用 -DTARGET_ENV=... 将其传递给 maven

关于java - 使用不同的 Spring 属性进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076466/

相关文章:

java - 在延迟初始化和一般情况下,覆盖可以有效替代 if 语句吗?

java - 如何在 LocalTime 中设置必要的时区

java - Accumulo - 将超出缓冲区限制的突变集合添加到批处理编写器

java - 来自 codehouse 的 Maven 动物嗅探器插件找不到 org.jvnet 签名

maven-2 - 大型项目的依赖管理

java - 线程中的异常 "main"java.lang.UnsupportedClassVersionError : org/apache/derby/derda/NetworkServerControl < Unsupported major. 次要 49.0 >

java - Spring MockMVC测试中,如何链式访问多个网页?

java - Spring Data - MongoDB - 更多与 和 相关的术语

java - 带有文本/html 响应的响应式(Reactive) WebClient GET 请求

maven - mvn部署问题