Настройка тестов интеграции с использованием Spring / Jetty (или Tomcat) / Maven для тестов REST

Я хотел бы протестировать нашу службу REST с HTTP-запросами (вроде тестирования черного ящика). Однако после пары часов поиска в Google и разных конфигураций я все еще не могу правильно запустить 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 или запустите виртуальную машину Java с помощью агента Spring: -javaagent: org.springframework.instrument.jar

Я понимаю исключение, но мне не удалось его исправить. Я также попробовал несколько других подходов, например, передать javaagent через MAVEN_OPTS или попытаться установить аргументы виртуальной машины в 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

Я с радостью предоставлю дополнительную информацию, если потребуется. Как я уже сказал, каждая помощь приветствуется.


person hjuskewycz    schedule 04.04.2011    source источник
comment
Вам нужно ткачество времени загрузки для интеграционного теста?   -  person sourcedelica    schedule 04.04.2011
comment
Погугливание кажется, что MAVEN_OPTS - это правильный путь, и вам нужно убедиться, что на вашем пути к банке нет пробелов.   -  person sourcedelica    schedule 04.04.2011
comment
Как я уже писал, я много гуглил, и я также нашел MAVEN_OPTS, тем не менее, ни одно решение не сработало, в пути нет пробелов.   -  person hjuskewycz    schedule 05.04.2011
comment
о том, нужно ли мне ткать время загрузки для интеграционного теста, на самом деле я не уверен на 100%. В нашем приложении мы используем его для поддержки аннотаций и транзакций, поэтому я думаю, что да.   -  person hjuskewycz    schedule 05.04.2011


Ответы (3)


Плагин jetty-maven-plugin теперь поддерживает цель run-forked, в которой вы можете передавать аргументы JVM. Намного проще, чем кот с грузом или MAVEN_OPTS.

person Bob Fields    schedule 24.10.2012

На самом деле это не связано с сервисами ReST, и только от случая к случаю связано со Spring. Ваша проблема связана с AspectJ и включением ткачества во время загрузки в JVM. Вы говорите, что понимаете исключение, но я не уверен, что вы понимаете. Вы читали раздел Плетение во время загрузки с AspectJ в справочнике Spring? Обратите особое внимание на конфигурация среды. Проблема в том, что реализация Jetty ClassLoader не поддерживает преобразование классов, и я не знаю никаких альтернатив, которые поддерживают, поэтому единственный оставшийся вариант - использовать агент. В идеале это была бы опция конфигурации в плагине Maven Jetty, но, насколько мне известно, у него все еще нет возможности создать новую JVM для сервера Jetty, что прискорбно. Следовательно, поскольку Jetty работает в той же JVM, что и Maven, вы должны указать там агент. Вы говорите, что уже сделали это, но, должно быть, что-то упускаете. Я разместил пример исполняемого файла на 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.

person Ryan Stewart    schedule 18.09.2011

У меня тоже проблемы с Jetty.

Если вы, как и я, без проблем используете Tomcat для разработки, я бы посоветовал вам придерживаться tomcat для их автоматического тестирования.
Пример использования Jetty в различных учебниках отлично работает, потому что их пример приложения. слишком просто (привет, мир, jsp ...).

Для реального применения конфигурация причала более сложна, и преимущества ее использования исчезают вместе с этим.

Jetty требует другой конфигурации, чем та, что с Tomcat.
Так что это боль в .. поддерживать это, и я не нашел никакой пользы в их плохой документации.

Сейчас я использую локальный кот с грузом: запустите его, запустите их, остановите кота. Вам не нужно изучать причалы, просто повторно используйте вашу фактическую конфигурацию tomcat.
Единственное предварительное требование - это иметь Tomcat, уже установленный на вашем компьютере, и переменную среды, указывающую на него.

Вы даже можете пропустить это и загрузить автоматически в первый раз с конфигурацией груза.

person Omar Elfada    schedule 18.09.2011