簡體   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