5

我想用HTTP请求测试我们的REST服务(有点黑盒测试)。然而,经过几个小时的谷歌搜索和尝试不同的配置,我仍然无法正确启动Jetty。这里是我当前的配置(我试过多个不同版本):使用Spring/Jetty(或Tomcat)/ Maven进行REST测试配置集成测试

的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(Class FileTransformer)'方法。指定自定义的LoadTimeWeaver或使用Spring的代理启动Java虚拟机:-javaagent:org.springframework.instrument.jar

我明白了异常,但我没能解决它。我还尝试了其他两种方法,例如通过MAVEN_OPTS提供javaagent或尝试将VM参数设置为Jetty。问题是Google为不同的版本回馈了一堆“解决方案”,而且没有一个能够发挥作用。

我目前相当沮丧,像做REST服务测试这样的常见场景,在Spring中很难实现。所以,如果你足够聪明,找到合适的配置,请以一种即使是猴子可以配置它的方式与我分享,我保证如果我们见过啤酒在我身上。

下面是我用的版本:

<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

如果需要,我高兴地提供更多的信息。就像我说的每一个帮助赞赏。

+0

您是否需要加载时间编织进行集成测试? – sourcedelica 2011-04-04 13:47:50

+0

谷歌搜索似乎像MAVEN_OPTS是要走的路,你需要确保你的路径中没有空间的jar。 – sourcedelica 2011-04-04 14:05:40

+0

就像我写的,我做了很多谷歌,我也发现MAVEN_OPTS,但是,没有解决方案的工作,路径中没有空格。 – hjuskewycz 2011-04-05 08:13:44

回答

0

我也有Jetty的问题。

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

对于真实世界的应用程序,jetty的配置更复杂,使用它的好处也随之消失。

Jetty需要其他配置,而不是使用Tomcat的配置。
所以这是一个痛苦,在维持这一点,我发现他们的文档很差,没有价值。

我现在正在使用一个本地tomcat与货物:启动它启动它们,停止tomcat。 你不需要学习码头的东西只是重用你的实际tomcat配置。
唯一的先决条件是让tomcat已经安装在您的机器上并指定一个环境变量。

你甚至可以跳过它并在货物配置的第一次自动下载。

3

这实际上并不涉及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有关。

4

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