繁体   English   中英

Jersey rest测试由于资源方法内部的会话而失败

[英]Jersey rest test fails because of session inside of resource method

我有Jersey休息api,但是当我尝试对其进行测试时,由于我在那里获取了会话数据而失败,所以问题是,我该如何模拟或忽略该会话变量,而Jersey无法检测到该变量?

这是我的测试请求:

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

问题是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提供商。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM