【问题标题】:Configuring Integration Tests using Spring/Jetty (or Tomcat)/Maven for REST tests使用 Spring/Jetty(或 Tomcat)/Maven 为 REST 测试配置集成测试
【发布时间】:2011-07-29 03:44:44
【问题描述】:

我想用 HTTP 请求测试我们的 REST 服务(有点像黑盒测试)。但是,经过几个小时的谷歌搜索并尝试了不同的配置,我仍然无法正确启动 Jetty。这是我当前的配置(我尝试了多个不同的版本):

pom.xml

        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <junitArtifactName>junit:junit</junitArtifactName>
                <excludes>
                    <exclude>**/*_Roo_*</exclude>
                    <exclude>**/*Util*</exclude>
                    <exclude>**/*IT*</exclude>
                </excludes>
                <forkMode>once</forkMode>
                <argLine>-javaagent:'${settings.localRepository}/org/springframework/spring-instrument/${org.springframework-version}/spring-instrument-${org.springframework-version}.jar' -javaagent:'${settings.localRepository}/org/aspectj/aspectjweaver/${org.aspectj-version}/aspectjweaver-${org.aspectj-version}.jar'</argLine>
                <useSystemClassLoader>true</useSystemClassLoader> 
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>-javaagent:'${settings.localRepository}/org/springframework/spring-instrument/${org.springframework-version}/spring-instrument-${org.springframework-version}.jar' -javaagent:'${settings.localRepository}/org/aspectj/aspectjweaver/${org.aspectj-version}/aspectjweaver-${org.aspectj-version}.jar'</argLine>
                <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                    </goals>
                </execution>
                <execution>
                    <id>verify</id>
                    <goals>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>  
            <groupId>org.mortbay.jetty</groupId>  
            <artifactId>maven-jetty-plugin</artifactId>  
            <version>6.1.10</version>  
            <configuration>  
                <scanintervalseconds>10</scanintervalseconds>  
                <stopkey>foo</stopkey>  
                <stopport>9999</stopport>  
                <contextpath>/${project.artifactId}</contextpath>  
                <connectors>  
                    <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">  
                        <port>9090</port>  
                    </connector>  
                </connectors>  
            </configuration>  
            <executions>  
                <execution>  
                    <id>start-jetty</id>  
                    <phase>pre-integration-test</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <scanintervalseconds>0</scanintervalseconds>  
                        <daemon>true</daemon>  
                    </configuration>  
                </execution>  
                <execution>  
                    <id>stop-jetty</id>  
                    <phase>post-integration-test</phase>  
                    <goals>  
                        <goal>stop</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>
        ...

orm.xml

<!-- <context:load-time-weaver/> -->
<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
<context:spring-configured/>
<context:annotation-config />
<context:component-scan base-package="com.example.jump.domain">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
    <tx:annotation-driven transaction-manager="transactionManager" />

现在,我遇到了异常:

  • java.lang.IllegalStateException:ClassLoader [org.mortbay.jetty.webapp.WebAppClassLoader] 不提供“addTransformer(ClassFileTransformer)”方法。指定自定义 LoadTimeWeaver 或使用 Spring 的代理启动 Java 虚拟机:-javaagent:org.springframework.instrument.jar

我了解该异常,但我无法修复它。我还尝试了其他几种方法,例如通过 MAVEN_OPTS 提供 javaagent 或尝试将 VM args 设置为 Jetty。问题是谷歌针对不同版本返回了一堆“解决方案”,但都没有奏效。

目前我很沮丧,因为在 Spring 中很难实现像进行 REST 服务测试这样的常见场景。因此,如果您足够聪明地找到正确的配置,请以即使猴子也能配置的方式与我分享,我保证如果我们遇到啤酒就在我身上。

这是我使用的版本:

<properties>
    <java-version>1.6</java-version>
    <org.springframework-version>3.0.5.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.9</org.aspectj-version>
    <org.slf4j-version>1.5.10</org.slf4j-version>
    <redis.version>1.0.0.BUILD-SNAPSHOT</redis.version>
    <org.jboss.hibernate.version>3.6.0.Final</org.jboss.hibernate.version>
    <net.sf.ehcache.version>2.3.1</net.sf.ehcache.version>
</properties>

Maven 2.21

如果需要,我很乐意提供更多信息。就像我说的,每一个帮助都很感激。

【问题讨论】:

  • 集成测试是否需要加载时间编织?
  • 谷歌搜索似乎 MAVEN_OPTS 是要走的路,你需要确保你的 jar 路径中没有空格。
  • 就像我写的那样,我用谷歌搜索了很多,我也找到了 MAVEN_OPTS,但是,没有解决方案,路径中没有空格。
  • 关于集成测试是否需要加载时间编织,实际上我不是 100% 确定。在我们的应用程序中,我们将其用于注释支持和事务,所以我认为是的。

标签: spring rest integration-testing maven-jetty-plugin load-time-weaving


【解决方案1】:

jetty-maven-plugin 现在支持 run-forked 目标,您可以在其中传递 JVM 参数。比带货物或 MAVEN_OPTS 的 tomcat 容易得多。

【讨论】:

    【解决方案2】:

    这实际上与 ReST 服务无关,只是偶然与 Spring 相关。您的问题集中在 AspectJ 和在 JVM 中启用加载时编织。您说您了解例外情况,但我不确定您是否了解。您是否阅读过 Spring 参考中关于 Load-time weaving with AspectJ 的部分?特别注意environment-specific configuration。问题是 Jetty 的 ClassLoader 实现不支持类转换,我不知道有任何替代方案,所以剩下的唯一选择是使用代理。理想情况下,这将是 Maven Jetty 插件上的一个配置选项,但据我所知,它仍然无法为 Jetty 服务器生成新的 JVM,这是不幸的。因此,由于 Jetty 与 Maven 在同一个 JVM 中运行,因此您必须在那里指定代理。你说你已经做到了,但你一定错过了什么。我已经发布了executable example on github。您可以查看源代码或克隆并运行示例:

    git clone git://github.com/zzantozz/testbed.git tmp
    export MAVEN_OPTS=-javaagent:org.springframework.instrument-3.0.5.RELEASE.jar
    cd tmp/spring-aspectj-load-time-weaving-in-jetty
    mvn jetty:run
    

    然后访问http://localhost:8080/spring-aspectj-load-time-weaving-in-jetty/ 看看它是否有效。顺便说一句,这与 ReST 服务并没有真正的关系,只是偶然地与 Spring 相关。

    【讨论】:

      【解决方案3】:

      我对 Jetty 也有问题。

      如果您像我一样使用 Tomcat 进行开发没有问题,我建议您坚持使用 tomcat 来自动测试它们。
      在不同教程中使用 Jetty 的示例效果很好,因为它们的示例应用程序。很简单(hello world jsp...)。

      对于实际应用,jetty 的配置更加复杂,使用它的好处也随之消失。

      Jetty 需要其他配置,而不是 Tomcat。
      因此,维护这一点很痛苦,我发现他们糟糕的文档没有任何价值。

      我现在正在使用带有货物的本地 tomcat:启动它启动它们,停止 tomcat。 您不需要学习码头的东西,只需重用您的实际 tomcat 配置即可。
      唯一的前提是你的机器上已经安装了tomcat,并且有一个指向它的环境变量。

      您甚至可以跳过它并在第一次使用货物配置时自动下载。

      【讨论】:

        猜你喜欢
        • 2015-06-14
        • 2014-01-12
        • 2016-01-21
        • 2016-07-29
        • 2018-11-19
        • 2013-03-21
        • 2013-03-20
        • 2014-12-12
        • 2016-12-30
        相关资源
        最近更新 更多