2

问题是如何使用不同的属性文件进行集成测试。详细说明如下。

我正在尝试使用 Maven 进行容器集成测试,使用tomcat7-maven-plugin. 该项目使用 Spring 和 JPA。目前我想出的是以下几点:

  • 单元测试类名称遵循模式 *Test and run with mvn testbymaven-surefire-plugin
  • 集成测试类名称遵循 *IT 模式并使用mvn verifybymaven-failsafe-plugin
  • 通过执行,我可以触发启动和停止 tomcat 并部署 war 文件

所有这些都有效,当我运行mvn verifyTomcat 时就会启动。

但是,我不想使用常规数据库,而是想使用内存数据库。我的数据库配置是在src/main/resources/META-INF/spring/database.properties通过context:property-placeholder.

我试图在 中定义一个替代文件src/test/resources/META-INF/spring/database.properties,但被忽略了。我知道可以在 中定义系统属性tomcat7-maven-plugin,但我不知道如何使用它们来触发加载不同的属性文件。

我的tomcat7-maven-plugin配置如下:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.1</version>
    <configuration>
        <port>9090</port>
        <path>/processing</path>
        <useTestClasspath>true</useTestClasspath>
        <systemProperties>
            <example.value.1>alpha</example.value.1>
        </systemProperties>
    </configuration>
    <executions>
        <execution>
            <id>start-tomcat</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>run-war-only</goal>
            </goals>
            <configuration>
                <fork>true</fork>
            </configuration>
        </execution>
        <execution>
            <id>stop-tomcat</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>shutdown</goal>
            </goals>
        </execution>
    </executions>
</plugin>

context-main.xml使用以下行加载属性:

<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>  

我使用以下内容加载上下文配置web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/context-*.xml</param-value>
</context-param>

关于如何加载替代属性文件进行测试的任何建议?

4

1 回答 1

2

一种方法是使用 Maven 配置文件和 ant 插件。我怀疑这不是最优雅的方式,我愿意倾听更好的解决方案,但现在它解决了我的问题。

配置文件是一种根据命令行参数拥有不同 Maven 配置的方法,因此在我的情况下运行集成测试,我运行 command mvn -Pintegration clean verify。这integration是配置文件的名称,并在 中定义pom.xmlproperties如下所示:

<profiles>
    <profile>
        <id>standard</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>integration</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.1</version>
                    <executions>
                        <execution>
                            <phase>test</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>Copying test database.properties to ${project.build.outputDirectory}/META-INF/spring/</echo>
                                    <copy file="src/test/resources/META-INF/spring/database.properties"
                                        todir="${project.build.outputDirectory}/META-INF/spring/" verbose="true" overwrite="true" />
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

使用mvn clean package将改为使用标准配置文件。有趣的是,配置文件也可以在 pom 之外定义,在 .m2/settings.xml

另请参阅:Building For different Environments with Maven 2 -- 请注意,overwrite副本中的参数是必不可少的,否则它将仅随机起作用,并且在链接的文档中未提及。

于 2013-03-23T22:05:31.470 回答