如何:针对测试环境(数据库)运行 maven 集成测试

我正在使用maven和maven-failafe-plugin在集成测试生命周期阶段启动码头。然后,我对正在运行的 web 应用执行了许多 (*IT.java) junit 测试。这按预期工作。

但是,我想连接到测试数据库以进行集成测试。我正在存储其网址

${basedir}/src/test/resources/jdbc.properties  

当码头插件运行时(码头:运行),它使用

${basedir}/src/main/resources/jdbc.propertes 

相反。我尝试通过classDirectory属性重新配置码头插件以使用

${project.build.testOutputDirectory}

但是测试类目录缺少我实际编译的项目类,以及存储在

${basedir}/src/main/resources 

注意:surefire 将测试资源添加到类路径中,然后是主资源,这样在两者中找到的任何内容都将使用测试版本,因为它首先在类路径中找到。

关于如何正确设置此设置的任何想法?

谢谢!

编辑:

好吧,似乎在jetty插件上有配置属性来处理这个问题:

  • testClassesDirectory :包含生成的测试类的目录。
  • useTestClasspath :如果为 true,则 test 的依赖项将放在运行时类路径的第一位。

不幸的是,它们不起作用。

这是我的pom.xml的相关部分:

  <testResources>
        <testResource>
            <filtering>true</filtering>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>
    <plugins>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.26</version>
            <configuration>
                <contextPath>/</contextPath>
                <stopPort>8005</stopPort>
                <stopKey>STOP</stopKey>
            </configuration>
            <executions>
                <execution>
                    <id>start-jetty</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <daemon>true</daemon>
                        <useTestClasspath>true</useTestClasspath>
                        <testClassesDirectory>${project.build.testOutputDirectory}</testClassesDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>stop-jetty</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <useFile>false</useFile>
            </configuration>
        </plugin>

答案 1

我有大致相同的问题,并使用自定义Web解决了它.xml(jettyweb.xml)请参阅maven配置

    <build>
    <plugins>

        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <configuration>
                <overrideWebXml>./src/main/webapp/WEB-INF/jettyweb.xml</overrideWebXml>
                <scanintervalseconds>3</scanintervalseconds>
            </configuration>
            <dependencies>

            </dependencies>
        </plugin>
    </plugins>

</build>

在我的情况下,我使用此配置来使用其他一些spring配置来管理事务。但此策略也可用于使用其他属性文件。

我原来的网页.xml有这个弹簧配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/spring-hibernate.xml,
    /WEB-INF/spring-services.xml
    </param-value>
</context-param>

我的码头网.xml有这个弹簧配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/spring-hibernate-jetty.xml,
    /WEB-INF/spring-services.xml
    </param-value>
</context-param>

这应该让你走上正确的道路


答案 2

我用过

<configuration>
  <jettyEnvXml>src/test/webapp/WEB-INF/jetty-env.xml</jettyEnvXml>
  .
  .

与内容

<?xml version="1.0"?>
    <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <New id="MyDb" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>jdbc/myDS</Arg>
        <Arg>
             <New class="org.apache.commons.dbcp.BasicDataSource">
                <Set name="driverClassName">org.h2.Driver</Set>
                <Set name="url">jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS TESTDB\;SET SCHEMA TESTDB</Set>
                <Set name="username">sa</Set>
                <Set name="password"></Set>
            </New>
         </Arg>
    </New>
</Configure>

我还需要在我的网络中.xml

<resource-ref>
    <res-ref-name>jdbc/myDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

我用了弹簧配置

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/myDS" />
</bean>

推荐