0

我有 Jersey rest 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;
}
4

1 回答 1

1

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

为了将 配置JerseyTest为 servlet 容器,我们需要覆盖另外两个方法,configurDeployment并且getTestContainerFactory. 对于后者,我们需要返回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 提供程序。

于 2016-05-20T11:20:16.263 回答