簡體   English   中英

如何使用Jersey 2測試框架為此類編寫單元測試

[英]How to write Unit Test for this class using Jersey 2 test framework

我正在嘗試為Rest api調用編寫單元測試,該調用具有POST方法,用於使用Jersey2將視頻文件添加到基於Web的應用程序。 這是我想要編寫單元測試的類( TemplateController.java )方法的簽名:

@POST
@Path("/video/add")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addVideoData(
    @Context HttpServletRequest request, 
    AttachmentDTO attachmentDTO) {
        ...
}

這是我測試類的測試方法( TemplateControllerUnitTestCase.java ):

@Test
public void videoAdd_requestObjectIsNull_ResponseStatusIsOK() throws Exception {
    // arrange
    Builder builder = target("/target/video/add").request();
    // action
    final Response response = builder.post(Entity.entity(attachemntDTO, MediaType.APPLICATION_JSON));
    // assertion
    ...
}

我能夠在傳遞AttachmentDAO對象到TemplateController從測試類類,但無法通過這是越來越無效的請求對象method(addVideoData())的的TemplateController.java class

我正在使用RequestHelper類,它是HttpServletRequest的輔助類,所以我想使用Jersey2測試框架將此類的對象傳遞給method(addVideoData())

您可以使用Jersey 2的HK2功能,這有助於依賴注入 這樣做,您可以為HttpServletRequest創建一個Factory ,並從RequestHelper返回模擬。 例如

public class HttpServletRequestFactory implements Factory<HttpServlet> {

    @Override
    public HttpServletRequest provide() {
       return RequestHelper.getMockServletRequest();
    }

    @Override
    public void dispose(HttpSession t) {
    }
}

然后在JerseyTest子類中,只需使用ResourceConfig注冊一個AbstractBinder 例如

@Override
public Application configure() {
    ResourceConfig config = new ResourceConfig(...);
    config.register(new AbstractBinder(){
        @Override
        public void configure() {
            bindFactory(HttpServletRequestFactory.class).to(HttpServletRequest.class);
        }
    });
} 

另外一個選項

...根本不是模擬HttpServletRequest ,而是使用實際的HttpServletRequest 為此,我們需要在覆蓋getDeploymentContext()配置DeploymentContext ,並返回ServletDeploymentContext 你可以在這里這里看到一個例子。 第一個還有一個使用Factory的示例,而第二個示例顯示了如何基於web.xml設置進行配置。 如果您選擇getTestContainerFactory HttpServletRequest的情況,那么您不需要覆蓋getTestContainerFactoryconfigureDeployment如示例中所示。 只要使用Application configure()覆蓋就足夠了,只要其他任何東西都不依賴於servlet功能。

鏈接中的示例使用

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>${jersey.version}</version>
</dependency>

額外

我鏈接的示例都試圖利用Sevlet功能。 所以我將給出一個使用請求模擬的完整示例。

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Assert;
import org.junit.Test;

public class MockHttpSevletRequestTest extends JerseyTest {

    @Path("http")
    public static class HttpResource {
        @GET
        public Response getResponse(@Context HttpServletRequest request) {
            return Response.ok(request.getMethod()).build();
        }
    }

    @Override
    public Application configure() {
        ResourceConfig config = new ResourceConfig(HttpResource.class);
        config.register(new AbstractBinder() {
            @Override
            public void configure() {
                bindFactory(HttpServletRequestFactory.class)
                        .to(HttpServletRequest.class);
            }
        });
        return config;
    }

    public static class HttpServletRequestFactory implements Factory<HttpServletRequest> {

        @Override
        public HttpServletRequest provide() {
            return new MockHttpServletRequest();
        }

        @Override
        public void dispose(HttpServletRequest t) {
        }
    }

    @Test
    public void test() {
        String response = target("http").request().get(String.class);
        System.out.println(response);
        Assert.assertEquals("POST", response);
    }
}

MockHttpServletRequest很簡單,是一個HttpServletRequest的虛擬實現,我只重寫一個方法getMethod()並始終返回POST 你可以從結果中看到,即使它是一個get請求,它仍然會返回POST

public class MockHttpServletRequest implements HttpServletRequest {

    @Override
    public String getMethod() {
        return "POST";
    }
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM