Я хотел смоделировать HttpServletRequest
объект, который помещен в класс ресурсов Джерси.Я расширяю класс JerseyTest.
package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.ServletDeploymentContext;
import org.glassfish.jersey.test.TestProperties;
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainerFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
import static javax.ws.rs.core.Response.Status.OK;
@RunWith(MockitoJUnitRunner.class)
public class CopyAuthResourceV2ApiTest extends JerseyTest {
private ObjectMapper objectMapper;
@Path("base")
public static class AuthResource {
@Context
private HttpServletRequest request;
@GET
@PermitAll
@Path("fetch")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response fetchUser(@QueryParam("id") String id) {
HttpSession session = request.getSession(false); // need to mock
if (session != null) {
Object o = session.getAttribute(id); // need to mock
return Response.status(OK)
.entity(o)
.build();
}
return Response.status(INTERNAL_SERVER_ERROR)
.entity("Internal server error.")
.build();
}
}
@Provider
public static class DebugMapper implements ExceptionMapper<Throwable> {
public Response toResponse(Throwable e) {
e.printStackTrace();
return Response.serverError().build();
}
}
@Override
protected DeploymentContext configureDeployment() {
objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
enable(TestProperties.LOG_TRAFFIC);
ResourceConfig config = new ResourceConfig(AuthResource.class, DebugMapper.class);
return ServletDeploymentContext.forServlet(new ServletContainer(config))
.build();
}
@Override
protected TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
@Test
public void asd() {
Response response = target("base/fetch").queryParam("id", "testId").request().cookie(new Cookie("JSESSIONID", "42rFCUx8EhBeB15mXH8iY7_YEwmv4hIE_oVkymVC")).get();
}
}
Я пытался смоделировать эту зависимость, как предлагают статьи:
Ссылка 1 Ссылка 2 Ссылка 3
но безрезультатно.Я использую тестовый фрейм Джерси с jersey-test-framework-provider-grizzly2
и jersey-container-grizzly2-servlet
.
HttpServletRequest
должен возвращать HttpSession
объект, который имитировал метод getAttribute
.Кто-нибудь знает решения этой проблемы?