2012-12-06 15 views
6

Używam Arquilliana [1] do testowania mojej aplikacji J2EE w osadzonym środowisku glassfish wewnątrz Eclipse [2] -IDE.Arquillian: Dodanie pliku beans.xml powoduje, że "ArquillianServletRunner nie został znaleziony"

package test.java; 

import org.jboss.arquillian.container.test.api.Deployment; 
import org.jboss.arquillian.junit.Arquillian; 
import org.jboss.shrinkwrap.api.ArchivePaths; 
import org.jboss.shrinkwrap.api.ShrinkWrap; 
import org.jboss.shrinkwrap.api.asset.EmptyAsset; 
import org.jboss.shrinkwrap.api.spec.WebArchive; 
import org.junit.Assert; 
import org.junit.Test; 
import org.junit.runner.RunWith; 

@RunWith(Arquillian.class) 
public class ArquillianTest { 

    @Deployment 
    public static WebArchive createDeployment() { 
     return ShrinkWrap.create(WebArchive.class).addAsWebInfResource(EmptyAsset.INSTANCE, 
      ArchivePaths.create("beans.xml")); 
    } 

    @Test 
    public void test() { 
     Assert.assertNull(null); 
    } 
} 

Test wykonywany w porządku, dopóki nie pokazał dodać instrukcję ".addAsWebInfResource (...)". Podczas wykonywania tej czynności wyrzucany jest następujący wyjątek:

java.lang.IllegalArgumentException: ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer. 
at org.jboss.arquillian.protocol.servlet.ServletUtil.determineBaseURI(ServletUtil.java:64) 
at org.jboss.arquillian.protocol.servlet.ServletURIHandler.locateTestServlet(ServletURIHandler.java:60) 
at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor.invoke(ServletMethodExecutor.java:77) 
at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:120) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
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:135) 
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115) 
at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67) 
at org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:57) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
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.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:142) 
at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createTestContext(ContainerEventController.java:129) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
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.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:89) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
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.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:75) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
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.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:60) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
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:135) 
at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:111) 
at org.jboss.arquillian.junit.Arquillian$6.evaluate(Arquillian.java:263) 
at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:226) 
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314) 
at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46) 
at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:240) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:185) 
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314) 
at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46) 
at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Bez pliku bean.xml, oczywiście CDI nie działa.

Jak mogę uniknąć tego wyjątku?

Wysłałem mojego pom.xml do http://pastxt.com/P/7IT1VYWBUW

Środowiska: jdk1.7.0_02/Win7/Eclipse Juno SR1

[1] https://www.jboss.org/arquillian.html

[2] http://www.eclipse.org/

+0

Masz powtarzalny test, nad którym mógłbym pracować?Podczas gdy twój test wygląda podobnie do [tego konkretnego w adapterze GF] (https://github.com/arquillian/arquillian-container-glassfish/blob/master/glassfish-embedded-3.1/src/test/java/org/ jboss/arquillian/container/glassfish/embedded_3_1/app/IntegrationWarTestCase.java), nie mogę odtworzyć awarii, którą widzisz. –

+0

Mam zaktualizowane pytanie - klasa testowa jest zminimalizowana bez zależności teraz, mój pom.xml jest dostępny online; błąd istnieje po mojej stronie w tym środowisku. –

+0

Widziałem ten błąd kilka razy w różnych projektach i przez większość czasu było spowodowane ustawieniem jar/war/ear w metodzie adnotacji @ Deployment. Sprawdź wszystkie zależności i wszystkie klasy, których potrzebujesz do testu. Szczególnie jeśli używasz EJB, przejdź do zależności drugiego lub trzeciego poziomu, które są używane jako referencje @ EJB. –

Odpowiedz

5

I Przyjrzałam się twojemu POM i twojemu testowi. Problem wydaje się być związane z GLASSFISH-16964, przechodząc przez następujące wpisy dziennika:

SLF4J: The requested version 1.5.10 by your slf4j binding is not compatible with [1.6] 
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details. 
Dec 07, 2012 2:09:59 PM org.glassfish.api.ActionReport failure 
SEVERE: Exception while loading the app 
Dec 07, 2012 2:09:59 PM org.glassfish.deployment.admin.DeployCommand execute 
SEVERE: Exception while loading the app : org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V 

Masz kilka zależności w projekcie, które ciągnąć w v1.6.1 z slf4j-api. To wydaje się być sprzeczne z tym, czego wymaga GlassFish - wierzę, że jest to 1.5.10 przechodzenie przez logi osadzonego GlassFish.

Aby rozwiązać ten konkretny problem, należy przejść na wersję, która sprawia, że ​​GlassFish jest szczęśliwy. Dodałem niższą wersję jako zarządzaną zależność.

<dependencyManagement> 
    <dependencies> 
     .... 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.5.10</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</dependencies> 

Oczywiście, może to mieć wpływ na innych bibliotek, które zależą od nowszej wersji slf4-API, więc trzeba uważać na innych kwestiach.

Najlepszym sposobem rozwiązania tego problemu jest użycie zdalnego lub zarządzanego adaptera GlassFish Arquillian.

+0

[INFO] BUILD SUCCESSFUL Dziękujemy! –

+1

zależność: drzewo jest twoim przyjacielem! – cwash

+0

Mam ten sam problem i próbowałem tego samego rozwiązania podanego powyżej, ale mam ten sam problem, jeśli pozwala 'JavaArchive jar = ShrinkWrap.create (JavaArchive.class)' lub 'JavaArchive jar = ShrinkWrap.create (JavaArchive.class, Ale kiedy to robię: 'JavaArchive jar = ShrinkWrap.create (JavaArchive.class," test ")' działa dobrze, ale kiedy próbuję wstrzyknąć jakikolwiek komponent bean lub ejb, nie robi tego praca. Każdy pomysł? – TinyOS

-1

Miałem ten sam problem z Glassfish embedded 3.1.2. Ale wydaje się, że zostało to naprawione w 3.1.2.2.

<dependency> 
    <groupId>org.glassfish.main.extras</groupId> 
    <artifactId>glassfish-embedded-all</artifactId> 
    <version>3.1.2.2</version> 
    <scope>provided</scope> 
</dependency> 
0

Dodawanie poniżej web.xml wystarczyły dla mnie:

<servlet> 
    <servlet-name>ArquillianServletRunner</servlet-name> 
    <servlet-class>org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ArquillianServletRunner</servlet-name> 
    <url-pattern>/ArquillianServletRunner</url-pattern> 
</servlet-mapping> 
0

ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer. wskazuje na to, że wystąpił błąd podczas instalacji. Wiadomość - możesz myśleć i wyrażać o tym, czego chcesz - nie ma nic wspólnego z tym błędem (źródło: https://developer.jboss.org/thread/173340)! Musisz uzyskać dostęp do dzienników, aby dowiedzieć się, co jest nie tak, które są na konsoli lub w lokalizacji, która jest skonfigurowana w pliku określonym w właściwości systemu java.util.logging.config.file, np. dodać

handlers=java.util.logging.ConsoleHandler 
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter 
java.util.logging.SimpleFormatter.format=%4$s: %5$s%n 
java.util.logging.ConsoleHandler.level=FINEST 

W moim przypadku brakowało com.google.guava:guava:23.0:test a problem był związany z dodawaniem beans.xml jak Asset.EMPTY z folii termokurczliwej.