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

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

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

根据Maven配置文件,unit testing或集成测试,属性需要不同。

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

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

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

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

 

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

对于unit testing,您可能具有与生产中相同名称的属性文件,该文件将覆盖生产文件,因为它在类路径中较早。 例如,您可能在src/main/resources/my.properties具有生产属性,并在src/test/resources/my.properties覆盖unit testing的文件。

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

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

您可以尝试的另一件事是使用spring @Profile 。 但是使用它们会在代码中添加一些非生产设置,这是一种不好的做法。