我正在使用 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/