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

时间:2010-06-19 17:13:02

标签: 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 还是资源。奇怪的是,这种方法非常适合为主应用程序中的每个环境提供不同的JDBC参数。我们在src / main / resources中有几个文件夹,其中包含覆盖src / main / resources中默认属性的属性。它对src / test / resources的工作方式不同。我甚至不知道如何找到这种行为的原因。
  • 让Spring根据用户定义的Maven参数加载不同的属性文件。相同的属性用于主应用程序和单元测试。当它无法找到属性文件时,Spring也会抱怨(强迫我创建带有空文件的目录只是为了让构建完成)。

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

1 个答案:

答案 0 :(得分:5)

我们这样做的方法是根据变量选择属性文件,因此spring中的属性占位符看起来像这样:

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

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