Насмешливый класс HttpServletRequest при тестировании класса ресурсов Джерси - PullRequest
0 голосов
/ 23 сентября 2019

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

...