Gee*_*nya 3 java rest unit-testing jersey jersey-2.0
我正在尝试为Rest api调用编写单元测试,该调用具有POST方法,用于使用Jersey2将视频文件添加到基于Web的应用程序.这是TemplateController.java我想要编写单元测试的class()方法的签名:
@POST
@Path("/video/add")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addVideoData(
@Context HttpServletRequest request,
AttachmentDTO attachmentDTO) {
...
}
Run Code Online (Sandbox Code Playgroud)
这是我测试类(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
...
}
Run Code Online (Sandbox Code Playgroud)
我能够在传递AttachmentDAO对象到TemplateController从测试类类,但无法通过这是越来越无效的请求对象method(addVideoData())的TemplateController.java class.
我正在使用RequestHelper类,它是一个帮助类HttpServletRequest,所以我想将这个类的对象传递给method(addVideoData())使用Jersey2测试框架.
Pau*_*tha 11
您可以使用Jersey 2 的HK2功能,这有助于依赖注入.这样做,你可以创建一个Factoryfor HttpServletRequest并从你的返回模拟RequestHelper.例如
public class HttpServletRequestFactory implements Factory<HttpServlet> {
@Override
public HttpServletRequest provide() {
return RequestHelper.getMockServletRequest();
}
@Override
public void dispose(HttpSession t) {
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的JerseyTest子类,只需注册一个AbstractBinder与ResourceConfig.例如
@Override
public Application configure() {
ResourceConfig config = new ResourceConfig(...);
config.register(new AbstractBinder(){
@Override
public void configure() {
bindFactory(HttpServletRequestFactory.class).to(HttpServletRequest.class);
}
});
}
Run Code Online (Sandbox Code Playgroud)
...是不要嘲笑HttpServletRequest,并使用实际HttpServletRequest.要做到这一点,我们需要配置DeploymentContext我们覆盖getDeploymentContext(),并返回一个ServletDeploymentContext.你可以在这里和这里看到一个例子.第一个还有一个使用a的示例Factory,而第二个示例显示了如何基于web.xml设置进行配置.如果您选择的情况下嘲讽HttpServletRequest,那么你就不会需要重写getTestContainerFactory,并configureDeployment作为例子可见.只要使用Application configure()覆盖就足够了,只要没有别的东西依赖于servlet功能.
链接中的示例使用
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我链接的示例都试图利用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);
}
}
Run Code Online (Sandbox Code Playgroud)
MockHttpServletRequest是一个简单的虚拟实现HttpServletRequest,我只覆盖一个方法,getMethod()并始终返回POST.你可以从结果中看到,即使它是一个get请求,它仍然会返回POST
public class MockHttpServletRequest implements HttpServletRequest {
@Override
public String getMethod() {
return "POST";
}
...
}
Run Code Online (Sandbox Code Playgroud)