由于资源方法内部的会话,泽西rest测试失败

我有泽西restapi,但当我尝试测试它失败,因为我在那里得到会话数据,所以问题是,我怎么能模拟或忽略这个会话变量,泽西岛无法检测到?

这是我的测试请求:

User response = target("/am/users/" + userId).request().get(new GenericType() { }); 

这是我的资源:

 @GET @Path("{userId}") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public User getUser(@PathParam("userId") String userId, @Context HttpServletRequest request) { User supportUser = (User)request.getSession().getAttribute("USER"); // Here is where it fails. User user = userDao.getUser(userId, supportUser); return user; } 

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

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

 public class ServletTest extends 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提供程序。