Имитация класса HttpServletRequest в тесте класса ресурсов Джерси

Я хотел издеваться над объектом 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 методом. Кто-нибудь знает решения этой проблемы?


person akaras    schedule 23.09.2019    source источник
comment
Сеансы определяются файлом cookie JSESSIONID. Таким образом, чтобы получить начальный файл cookie, вам нужно сделать первоначальный запрос на получение этого сеанса. Я не знаю, где вы это делаете. Затем, когда вы получите ответ, вам нужно извлечь файл cookie и отправить его обратно со следующим запросом. Клиент JAX-RS обладает всеми этими возможностями. Просто погуглите.   -  person Paul Samsotha    schedule 24.09.2019
comment
@PaulSamsotha Я еще раз отредактировал метод @Test, но у меня нет проблем с выполнением запроса. Мне нужно издеваться над объектом HttpServletRequest, и я спрашиваю, как это сделать.   -  person akaras    schedule 24.09.2019
comment
Используйте Mockito или сделайте свою заглушку, реализовав интерфейс. Вы можете либо использовать Mockito для внедрения экземпляра класса ресурсов, либо возражать против запроса через конструктор вместо поля. Таким образом, вы можете создать экземпляр ресурса, передающего макет. И зарегистрируйте экземпляр в ResourceConfig.   -  person Paul Samsotha    schedule 25.09.2019