我正在设置一个 CI 情况,我将在其中将我的 Web 应用程序部署到测试环境。在这个测试环境中,我希望应用程序使用的业务对象是真实对象的模拟;模拟将返回静态测试数据。我正在使用它对我的 ui 运行测试。我正在使用 Spring 控制这些业务对象依赖项的注入;这是一个 struts 2 应用程序,值得。
我认为我的问题与 Maven 相关。让我的 Maven 构建确定是否构建弹簧配置以注入模拟或注入真实事物的最佳方法是什么?这对 Maven 配置文件有用吗?其他选择?
我正在设置一个 CI 情况,我将在其中将我的 Web 应用程序部署到测试环境。在这个测试环境中,我希望应用程序使用的业务对象是真实对象的模拟;模拟将返回静态测试数据。我正在使用它对我的 ui 运行测试。我正在使用 Spring 控制这些业务对象依赖项的注入;这是一个 struts 2 应用程序,值得。
我认为我的问题与 Maven 相关。让我的 Maven 构建确定是否构建弹簧配置以注入模拟或注入真实事物的最佳方法是什么?这对 Maven 配置文件有用吗?其他选择?
Spring 本身支持配置文件(如果您使用的是 3.1 或更高版本),对于 Web 应用程序,您可以使用 context-parameter 为web.xml中的不同环境设置活动配置文件:
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>test</param-value>
</context-param>
编辑:对于 Maven 和 Jenkins,您应该能够为构建作业设置参数,如下所示:
首先,让 Maven 过滤您的 xml-resources(在此示例中,仅过滤以结尾的文件xml
,其他文件不过滤),方法是将以下内容添加到您的pom.xml中的<build> </build>
-tags 中:
<resources>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
<includes>
<include>**/*xml</include>
</includes>
</resource>
<resource>
<directory>src/main/webapp</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*xml</exclude>
</excludes>
</resource>
</resources>
然后,在web.xml中参数化上下文参数:
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>${env.SPRINGPROFILE}</param-value>
</context-param>
然后在 Jenkins 中参数化构建作业,为 SPRINGPROFILE 设置所需的字符串参数(例如test或prod):https ://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build
对 Web 应用程序工件的构建做任何事情可能是个坏主意(使用 CI/Hudson 支持为多个环境 [prod、test、dev] 生成工件的 Maven 最佳实践?)。虽然您可以使用各种机制来为不同的上下文生成具有不同 Spring 注入配置的 WAR 文件,但每次构建 WAR 工件时都应该是相同的。
为了从 WAR 中提取配置,我使用了 Spring 3 从外部属性文件中提取覆盖值的能力。我定义了我的业务对象的默认值,即生产值。我配置 spring 来检查属性文件的存在,当应用程序处于测试环境中并且需要模拟注入时,我将部署该文件。如果该属性文件存在,则将其值注入。这是spring配置文件的相关位。
<!-- These are the default values -->
<util:properties id="defaultBeanClasses">
<prop key="myManagerA">com.myco.ManagerAImpl</prop>
<prop key="myManagerB">com.myco.ManagerBImpl</prop>
</util:properties>
<!-- Pull in the mock overrides if they exist. -->
<context:property-placeholder
location="file:///my/location/mockBeans.properties"
ignore-resource-not-found="true"
properties-ref="defaultBeanClasses"/>
<!-- The beans themselves. -->
<bean id="managerA" class="${myManagerA}"/>
<bean id="managerB" class="${myManagerB}"/>
这是外部“mockBeans.properties”文件的内容:
#Define mock implementations for core managers
myManagerA=com.myco.ManagerAMockImpl
myManagerB=com.myco.ManagerBMockImpl
这很好用。如果您愿意,您甚至可以将 mockBeans.properties 文件包含在实际的 WAR 中,但不能包含在实时位置中。那么测试环境任务也会将其移动到spring config指向的位置。或者,您可以让模拟属性驻留在完全不同的项目中。