泽西单元测试参数错误500

时间:2017-06-06 10:06:50

标签: unit-testing servlets get jersey

我想用这个声明来测试一个方法:

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

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

但我得到500,内部服务器错误,我知道这是因为我的方法的第一个参数(@Context HttpServletRequest requestContext)但我不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

问题是Jersey测试没有在servlet环境中运行,这是使用servlet API所必需的。如果您不知道,Jersey不需要在servlet容器内运行。如果使用provider-grizzly2的情况,如果你没有设置测试容器,它将默认运行GrizzlyTestContainerFactory,它只启动Grizzly和HTTP服务器,而不是servlet容器。

为了将JerseyTest配置为servlet容器,我们需要覆盖另外两个方法,configurDeployment和getTestContainerFactory。对于后者,我们需要返回GrizzlyWebTestContainerFactory,它将设置servlet容器。在configureDeployment方法中,我们可以在servlet级别配置应用程序。

public class ServletTest扩展了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();
}

}

如果您使用的是provider-inmemory,它不支持servlet部署,因此您需要切换到jetty提供程序或者grizzly提供程序。