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容易得多。