2016-03-01 116 views
0

我开始使用Tomee 7.0.0-M1开发一个新的工程,并且我想用Arquillian测试JAX-RS服务,但是当我运行时出现以下错误从Intellilj测试:用Arquillian和Tomee嵌入测试JAX RS服务

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/catalina/loader/VirtualWebappLoader 
    at org.apache.tomee.catalina.TomcatLoader.initialize(TomcatLoader.java:222) 
    at org.apache.tomee.embedded.Container.start(Container.java:318) 
    at org.apache.openejb.arquillian.embedded.EmbeddedTomEEContainer.start(EmbeddedTomEEContainer.java:113) 
    at org.jboss.arquillian.container.impl.ContainerImpl.start(ContainerImpl.java:199) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$8.perform(ContainerLifecycleController.java:163) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$8.perform(ContainerLifecycleController.java:157) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.forContainer(ContainerLifecycleController.java:255) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.startContainer(ContainerLifecycleController.java:156) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.container.impl.client.ContainerDeploymentContextHandler.createContainerContext(ContainerDeploymentContextHandler.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:145) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:116) 
    at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$2.perform(ContainerLifecycleController.java:77) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$2.perform(ContainerLifecycleController.java:70) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.forEachSuiteContainer(ContainerLifecycleController.java:221) 
    at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.startSuiteContainers(ContainerLifecycleController.java:69) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:145) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:116) 
    at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67) 
    at org.jboss.arquillian.container.test.impl.client.ContainerEventController.execute(ContainerEventController.java:86) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:145) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:116) 
    at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.beforeSuite(EventTestRunnerAdaptor.java:68) 
    at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:104) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: java.lang.ClassNotFoundException: org.apache.catalina.loader.VirtualWebappLoader 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 67 more 

的奇怪的事情是,如果我从运行与Maven控制台测试,然后我得到一个不同的异常:

com.tr2.rest.bookings.BookingServiceTest Time elapsed: 1.35 sec <<< ERROR! 
java.lang.NoClassDefFoundError: org/apache/naming/resources/FileDirContext 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at org.apache.tomee.catalina.TomcatLoader.initialize(TomcatLoader.java:222) 
     at org.apache.tomee.embedded.Container.start(Container.java:318) 
     at org.apache.openejb.arquillian.embedded.EmbeddedTomEEContainer.start(EmbeddedTomEEContainer.java:113) 
     at org.jboss.arquillian.container.impl.ContainerImpl.start(ContainerImpl.java:199) 
     at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$8.perform(ContainerLifecycleController.java:163) 
     at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$8.perform(ContainerLifecycleController.java:157) 
     at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.forContainer(ContainerLifecycleController.java:255) 
     at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.startContainer(ContainerLifecycleController.java:156) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
     at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
     at org.jboss.arquillian.container.impl.client.ContainerDeploymentContextHandler.createContainerContext(ContainerDeploymentContextHandler.java:57) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 

我不知道我在做什么错误。我的源文件如下:

测试

@RunWith(Arquillian.class) 
public class BookingServiceTest { 

    @Deployment(testable = true) 
    public static WebArchive createDeployment() { 
     return ShrinkWrap.create(WebArchive.class) 
       .addClasses(
         BookingService.class, 
         GetBookingRS.class, 
         GetBookingRQ.class); 
    } 
    @ArquillianResource 
    private URL base; 

    private static WebTarget target; 

    @Before 
    public void setUpClass() throws MalformedURLException { 
     Client client = ClientBuilder.newClient(); 
     target = client.target(URI.create(new URL(base, "resources/booking/getBookings").toExternalForm())); 
    } 

    @Test 
    public void testResponse() throws InterruptedException, ExecutionException { 
     Future<Response> r1 = target.request().async().get(); 
     Response response = r1.get(); 
    } 

} 

arquillian.xml

<container qualifier="tomee" default="true"> 
    <configuration> 
     <property name="httpPort">-1</property> 
     <property name="stopPort">-1</property> 
    </configuration> 
</container> 

POM依赖

<dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>arquillian-tomee-embedded</artifactId> 
    <version>1.7.3</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>tomee-jaxrs</artifactId> 
    <version>1.7.3</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.tomee</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency>    
<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-catalina</artifactId> 
    <version>8.0.29</version> 
    <scope>provided</scope>    
</dependency> 
<dependency> 
    <groupId>org.apache.tomee</groupId> 
    <artifactId>apache-tomee</artifactId> 
    <version>7.0.0-M1</version> 
    <scope>provided</scope> 
</dependency>   
<dependency> 
    <groupId>org.apache.tomee</groupId> 
    <artifactId>tomee-jaxrs</artifactId> 
    <version>7.0.0-M1</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.tomee</groupId> 
    <artifactId>openejb-cxf</artifactId> 
    <version>7.0.0-M1</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.12</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>com.sun.xml.bind</groupId> 
    <artifactId>jaxb-xjc</artifactId> 
    <version>2.2.11</version> 
    <scope>provided</scope> 
</dependency 
<dependency> 
    <groupId>org.codehaus.jettison</groupId> 
    <artifactId>jettison</artifactId> 
    <version>1.3.4</version> 
    <scope>provided</scope> 
</dependency> 

任何想法?

谢谢!

回答

0

我只需要嵌入tomee适配器的正确版本:

<dependency> 
    <groupId>org.apache.tomee</groupId> 
    <artifactId>arquillian-tomee-embedded</artifactId> 
    <version>7.0.0-M1</version> 
    <scope>test</scope> 
</dependency>