2014-11-05 21 views
7

Sto provando a ottenere un test di jogging con uno org.glassfish.jersey.test.grizzly.GrizzlyWebContainerFactory. Ho già cercato su Internet e provato diverse cose per la parte migliore di una giornata. Sembra impossibile e apprezzerei davvero qualsiasi aiuto su come farlo funzionare.JerseyTest che utilizza GrizzlyWebTestContainerFactory in Jersey 2.13

Ho creato un esempio minimo basato sul codice della documentazione di Jersey 2. Il codice è simile:

package test; 

import static org.junit.Assert.assertEquals; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Application; 

import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.test.DeploymentContext; 
import org.glassfish.jersey.test.JerseyTest; 
import org.glassfish.jersey.test.ServletDeploymentContext; 
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory; 
import org.glassfish.jersey.test.spi.TestContainerException; 
import org.glassfish.jersey.test.spi.TestContainerFactory; 
import org.junit.Test; 

public class DistributedDeploymentTest extends JerseyTest { 

@Path("hello") 
public static class HelloResource { 
    @GET 
    public String getHello() { 
     return "Hello World!"; 
    } 
} 

@Override 
protected Application configure() { 
    return new ResourceConfig(HelloResource.class); 
} 

@Override 
protected TestContainerFactory getTestContainerFactory() throws TestContainerException { 
    return new GrizzlyWebTestContainerFactory(); 
} 

@Override 
protected DeploymentContext configureDeployment() { 
    return ServletDeploymentContext.builder(configure()).build(); 
} 

@Test 
public void testSingleNode() throws Exception { 
    final String hello = target("hello").request().get(String.class); 
    assertEquals("Hello World!", hello); 
} 
} 

Funziona perfettamente bene senza il GrizzlyWebTestContainerFactory. Tuttavia al momento l'esecuzione di questo esempio, ottengo sempre:

javax.ws.rs.NotFoundException: HTTP 404 Not Found 
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:956) 
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:795) 
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:91) 
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:683) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:679) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:408) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:308) 
    at de.tudresden.inf.rn.zeebus.DistributedDeploymentTest.testSingleNode(DistributedDeploymentTest.java:66) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    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:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

sto usando le seguenti dipendenze Maven:

 <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet</artifactId> 
      <version>2.13</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.test-framework</groupId> 
      <artifactId>jersey-test-framework-core</artifactId> 
      <version>2.13</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.test-framework.providers</groupId> 
      <artifactId>jersey-test-framework-provider-grizzly2</artifactId> 
      <version>2.13</version> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-server</artifactId> 
      <version>9.2.2.v20140723</version> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-webapp</artifactId> 
      <version>9.2.2.v20140723</version> 
     </dependency> 

risposta

8

Non certo perché non funziona con builder(configure()), ma se cambiamo a

return ServletDeploymentContext.forPackages(
            getClass().getPackage().getName()).build(); 

(come visto here), funzionerà (nessuna necessità di sovrascrivere configure). Potete vedere alcune più delle configurazioni di prova del campione in jersey-test-framework-examples


EDIT

"Ma come faccio ad aggiungere il mio sottoclasse personalizzata di ResourceConfig (non mostrato nell'esempio di cui sopra), in quel caso ?"

return ServletDeploymentContext.forServlet(new ServletContainer(
           new ResourceConfig(HelloResource.class))).build(); 

Come visto here

+0

Ok. Grazie. Ma come posso aggiungere la mia sottoclasse personalizzata di ResourceConfig (non mostrata nell'esempio sopra) in questo caso? – ali

+1

Vedere [qui] (https://github.com/jersey/jersey/blob/master/test-framework/providers/grizzly2/src/test/java/org/glassfish/jersey/test/grizzly/web/GrizzlyWebTest. java) –

+0

Grande! Funziona! – ali