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

时间:2016-05-20 10:22:38

标签: java rest session jersey jersey-test-framework

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

以下是我的测试请求:

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

这是我的资源:

@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;
}

1 个答案:

答案 0 :(得分:1)

问题是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提供商或者灰熊提供商。