2017-06-06 1 views
0

ich eine Methode, mit dieser Erklärung testen will:Jersey Unit-Test mit Parametern Fehlern 500

@GET 
@Path("/hello") 
public Response myMethod(@Context HttpServletRequest requestContext, 
         @QueryParam("key") String value){...} 

Response output = target("/hello/myMethod") 
        .queryParam("key", "value") 
        .request().get(); 

aber ich bekomme 500, interne Server-Fehler, ich weiß, dass es wegen des ersten Parameters meiner Methode ist (@Context HttpServletRequest requestContext), aber ich weiß nicht, wie ich es lösen soll.

+0

Was verwenden Sie zum Testen? –

Antwort

0

Das Problem besteht darin, dass der Jersey-Test nicht in einer Servlet-Umgebung ausgeführt wird, was für die Arbeit mit den Servlet-APIs erforderlich ist. Wenn Sie nicht wissen, muss Jersey nicht in einem Servlet-Container ausgeführt werden. Wenn Sie den provider-grizzly2 verwenden und den Testcontainer nicht einrichten, wird standardmäßig die GrizzlyTestContainerFactory ausgeführt, die nur Grizzly und einen HTTP-Server startet, keinen Servlet-Container.

Um den JerseyTest als Servlet-Container zu konfigurieren, müssen wir zwei andere Methoden überschreiben: configurDeployment und getTestContainerFactory. Mit letzterem müssen wir die GrizzlyWebTestContainerFactory zurückgeben, die den Servlet-Container einrichten wird. In der configureDeployment-Methode können wir die Anwendung auf Servlet-Ebene konfigurieren.

public class ServletTest erweitert JersyTest {

@Override 
public ResourceConfig configure() { 
    // configure Jersey 
} 

@Override 
public TestContainerFactory getTestContainerFactory() { 
    return new GrizzlyWebTestContainerFactory(); 
} 

@Override 
public DeploymentContext configureDeployment() { 
    return ServletDeploymentContext 
      .forServlet(new ServletContainer(configure())) 
      .build(); 
} 

}

Wenn Sie den Provider-inmemory verwenden, wird es nicht Servlet Implementierung unterstützen, so dass Sie an der Anlegestelle Provider wechseln müssen oder der Grizzly-Anbieter.