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

Java 使用不同的Spring属性进行集成测试,java,spring,maven-2,integration-testing,Java,Spring,Maven 2,Integration Testing,我正在使用Selenium测试一个使用Spring开发的web应用程序,以检查web应用程序是否为用户显示了正确的内容,以及用户是否能够执行规范中的所有操作 其他开发人员正在使用一个假的Hibernate内存数据库(HSQLDB)进行单元测试。显然,我必须使用程序用于测试的真实数据库。Spring应用程序上下文的JDBC参数由Spring在运行时(或编译时用于构建WAR文件)加载。Spring使用org.springframework.beans.factory.config.propertyP

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

其他开发人员正在使用一个假的Hibernate内存数据库(HSQLDB)进行单元测试。显然,我必须使用程序用于测试的真实数据库。Spring应用程序上下文的JDBC参数由Spring在运行时(或编译时用于构建WAR文件)加载。Spring使用org.springframework.beans.factory.config.propertyPlaceHolderConfigure找到的属性来配置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=

对于单元测试,您可能拥有与生产中同名的属性文件,这将覆盖生产中的属性文件,因为它在类路径中较早。 e、 g.生产属性可能位于
src/main/resources/my.properties
,单元测试的重写文件可能位于
src/test/resources/my.properties

良好的做法是使用一个单独的属性文件(仅包含环境设置(主机/端口))和其他使用特定于环境的属性文件中的值的特定于应用程序的属性文件。然后,环境特定的文件是唯一需要更改的文件。 对于集成测试,类路径中可能还有特定的属性文件

此外,在生产工件中不应该有特定于环境的设置。它们应该分开放置

您还可以尝试使用spring
@Profile
s。但是使用它们会在代码中添加一些非生产性设置,这是一种糟糕的做法。

好吧,我(或者更确切地说是我的同事)最终做了类似的事情。