2013-03-08 3 views
1

Мы хотели бы протестировать наши API REST с использованием arquillian.тестирование веб-сервисов REST с arquillian

Мы используем старую рыбку для производства и аркилян.

У нас уже есть аркилянские тесты для некоторой очереди JMS, которую мы показываем, и это работает отлично, поэтому у нас есть хотя бы некоторые основы. Когда мы начали использовать эту установку для тестирования REST, на первом HTTP GET мы послали на REST URLS, мы получили исключение: com.sun.jersey.api.container.ContainerException: No WebApplication provider is present.

Вот наша установка Shrinkwrap:

public static WebArchive createTestArchive() { 
    return ShrinkWrap.create(WebArchive.class, "test.war") // Create jar 
      .addPackages(true, "<our packages, plus some dependencies>") //, "com.ocpsoft.pretty") 
      .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") // b 
      .setWebXML("WEB-INF/web.xml") 
      .addAsWebInfResource("WEB-INF/faces-config.xml") 
      //.addAsWebInfResource(new StringAsset("<faces-config version=\"2.0\"/>"), "faces-config.xml") 
      .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml"); 

} 

Я думаю, что наши web.xml имеет значение:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>  
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 


    <!-- Pretty faces config --> 

    <filter> 
     <filter-name>Pretty Filter</filter-name> 
     <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class> 
     <async-supported>true</async-supported> 
    </filter> 

    <filter-mapping> 
     <filter-name>Pretty Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>ERROR</dispatcher> 
     <dispatcher>ASYNC</dispatcher> 
    </filter-mapping> 

    <!-- disable annotation scanning by the PrettyFaces module --> 
    <context-param> 
     <param-name>com.ocpsoft.pretty.BASE_PACKAGES</param-name> 
     <param-value>none</param-value> 
    </context-param> 

</web-app> 

EDIT: в связи с вопросом, я теперь изменен на GlassFish встраиваемый 3.1.1, и уточнен вопрос барельефа ed в новом сообщении об ошибке. Мы используем для основной операции 3-мерную глазурью 3.1.2.

Также обратите внимание, что мы сначала получить предупреждение:

WARNING: Could not instantiate service class org.glassfish.osgicdi.impl.OSGiServiceExtension 
java.lang.NoClassDefFoundError: org/osgi/framework/ServiceException 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 

[..]

Caused by: java.lang.ClassNotFoundException: org.osgi.framework.ServiceException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 

(но мне кажется, что это безопасно игнорировать это предупреждение, увидеть это и ошибка, то ссылки на : http://www.java.net/forum/topic/glassfish/glassfish/could-not-instantiate-service-class-orgglassfishosgicdiimplosgiserviceextension?force=217)

Тогда ошибка:

SEVERE: WebModule[/test]StandardWrapper.Throwable 
com.sun.jersey.api.container.ContainerException: No WebApplication provider is present 
    at com.sun.jersey.spi.container.WebApplicationFactory.createWebApplication(WebApplicationFactory.java:69) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.create(ServletContainer.java:391) 
    at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.create(ServletContainer.java:306) 
+1

Какой контейнер из аркиллиона (например, стеклянная рыба), вы используете? Если он встроен, имеет ли он ту же версию, что и у вашего целевого сервера? – Gab

ответ

3

Хорошо, с большой помощью от комментария Габа (никогда бы не сделал это без этого намека!), Я исправил проблему. Этот комментарий заставило меня сосредоточиться на версиях пакетов, и я понял, что Glassfish 3.1.2, который мы используем для производства, использует трикотаж 1.11, а встроенный в стеклянную панель 3.1.1, который мы теперь используем для тестирования (поскольку нет 3.1.2 на момент написания статьи), использует майку 1.8.

Поэтому я добавил следующие зависимости раздел TEST нашего pom.xml:

<!-- glassfish 3.1 ships with jersey 1.8, hence the version here. --> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.8</version> 
    <scope>provided</scope> 
    </dependency> 
    <dependency> 
    <groupId>com.sun.jersey.contribs</groupId> 
    <artifactId>jersey-multipart</artifactId> 
    <version>1.8</version> 
    </dependency> 
    <dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.8</version> 
    </dependency> 

Я оставил зависимости для трикотажа в главном разделе нашего pom.xml направлен к джерси 1.11.

И теперь проблема решена.

Мне жаль, что мы не смогли получить сообщение об ошибке для таких проблем!

Смежные вопросы