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

Pie*_*din 4 java spring integration-testing maven-2

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

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

根据Maven配置文件,单元测试或集成测试,属性需要不同.

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

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

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

shi*_*ter 6

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

<context:property-placeholder location="classpath:db.${TARGET_ENV}.properties" />
Run Code Online (Sandbox Code Playgroud)

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