5

REST servisimizi HTTP istekleriyle (kinda blackbox testing) test etmek isterim. Bununla birlikte, birkaç saat süren ve farklı yapılandırmaları deneyen birkaç saatten sonra, Jetty'i doğru şekilde başlatamıyorum. İşte benim şimdiki yapılandırma (birden çok farklı versiyonunu denedik) 'dir:REST testleri için Spring/Jetty (veya Tomcat)/Maven kullanarak Entegrasyon Testlerini Yapılandırma

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 Şu anda

<!-- <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" /> 

, ben istisna alıyorum:

  • java.lang.IllegalStateException: ClassLoader [org.mortbay.jetty.webapp.WebAppClassLoader] 'addTransformer (Class FileTransformer) yöntemi. Özel bir LoadTimeWeaver belirtin ya Spring'in ajan ile Java sanal makine başlatmak: -javaagent: org.springframework.instrument.jar

ben istisna anlıyorum ama bunu düzeltmek mümkün değildi. Ayrıca, MAVEN_OPTS aracılığıyla javaagent'i vermek veya VM argslerini Jetty'ye koymaya çalışmak gibi birkaç başka yaklaşımı da denedim. Sorun, Google'ın farklı sürümler için bir grup "çözüm" sunması ve hiçbirinin işe yaramadı.

Şu anda, REST servis testleri yapmak gibi ortak bir senaryonun, Baharda başarmak için çok zor olduğu konusunda oldukça sinirliyim. Doğru yapılandırmayı bulmak için yeterince akıllı olursanız, lütfen bir maymunun bile onu yapılandırabileceği şekilde paylaşın ve biralarla tanışsak söz veriyorum.

Burada kullandığım sürümleri şunlardır:

<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

gerekirse mutlulukla daha fazla bilgi sağlar. Her yardımın takdir edildiğini söylediğim gibi.

+0

Entegrasyon testi için yükleme süresi dokumasına ihtiyacınız var mı? – sourcedelica

+0

Çevresinde gezinmek MAVEN_OPTS gitmek için yol gibi görünüyor ve kavanoza giden yolda hiçbir boşluk olmadığından emin olmanız gerekiyor. – sourcedelica

+0

Yazdığım gibi, etrafta çok şey yaptım ve ayrıca MAVEN_OPTS'yi buldum, yine de çözüm bulunamadı, yolda boşluk yok. – hjuskewycz

cevap

0

Ben de Jetty ile sorunlarım var.

Tomcat'i geliştirmeden sorun olmadan kullanmıyorsanız, bunları otomatik olarak test etmek için tomcat'e bağlı kalmanızı tavsiye ederim.
Farklı öğreticilerdeki Jetty'yi kullanmanın örneği, örnek uygulamalarından dolayı harika çalışıyor. basit bitti (merhaba dünya jsp ...).

Gerçek dünya uygulaması için iskelenin konfigürasyonu daha karmaşıktır ve kullanmanın yararları bununla gider.

İskele, Tomcat'e sahip olandan başka yapılandırmayı gerektirir.
Bu, bunu sürdürmek için bir acıdır ve zayıf belgeleriyle hiçbir değer bulamadım.

Şu an kargoyla birlikte yerel bir tomcat kullanıyorum: başlatmaya başlayın, tomcat'i durdurun. İskelet malzemelerini öğrenmeye ihtiyacın yok, sadece gerçek tomcat yapılandırmanızı tekrar kullan.
Tek ön koşul, makinenize zaten yüklenmiş tomcat ve ona işaret eden bir ortam değişkenine sahip olmaktır.

Hatta bunu atlayabilir ve bir kargo yapılandırmasıyla ilk kez otomatik olarak indirebilirsiniz.

3

Bu gerçekten ReST hizmetleriyle ilgili değildir ve yalnızca Spring ile ilgili olarak ilgilidir. Sorununuz AspectJ etrafında ortalanmış ve JVM'de yük-zaman dokumasını mümkün kılıyor. Bu istisnayı anladığını söylüyorsun, ama emin değilim. Bahar referansında Load-time weaving with AspectJ bölümünü okuyor musunuz? environment-specific configuration'a özellikle dikkat edin. Sorun, Jetty'nin ClassLoader uygulamasının sınıf dönüşümünü desteklememesi ve yapılan herhangi bir alternatifi bilmem ki, bu yüzden tek seçenek aracı kullanmaktır. İdeal olarak, bu Maven Jetty eklentisi üzerinde bir konfigürasyon seçeneği olurdu, ancak benim bilgi için, hala talihsiz bir Jetty sunucusu için yeni bir JVM üretme yeteneği yok. Bu nedenle, Jetty Maven ile aynı JVM'de çalıştığı için, oradaki acenteyi belirtmeniz gerekir. Bunu zaten yaptığını söylüyorsun ama bir şeyleri kaçırıyor olmalısın. Bir executable example on github yayınladım. o iş görmek

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 

Sonra http://localhost:8080/spring-aspectj-load-time-weaving-in-jetty/ ziyaret edin: Eğer kaynak kodu veya klon bakmak ve birlikte örnek çalıştırabilirsiniz. Tesadüfen, bu gerçekten ReST servisleriyle ilgili değil ve sadece Spring ile ilgili.

4

Jetty-maven-plugin şimdi JVM argümanlarını iletebileceğiniz, koşulan golü destekliyor. Kargo veya MAVEN_OPTS ile tomcat'den çok daha kolay.