您可以使用HK2Jersey 2 的功能,有助于依赖注入。通过这种方式,您可以创建一个Factory for HttpServletRequest
并从你的返回模拟RequestHelper
。例如
public class HttpServletRequestFactory implements Factory<HttpServlet> {
@Override
public HttpServletRequest provide() {
return RequestHelper.getMockServletRequest();
}
@Override
public void dispose(HttpSession t) {
}
}
然后在你的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);
}
});
}
另外一个选择
...就是不要嘲笑HttpServletRequest
并使用实际的HttpServletRequest
。为此,我们需要配置DeploymentContext
当我们重写getDeploymentContext()
,并返回一个ServletDeploymentContext
。你可以看一个例子here and here。第一个也有一个使用的例子Factory
,而第二个则显示如何基于 web.xml 设置进行配置的示例。如果你选择这个案例来嘲笑HttpServletRequest
, 然后你wouldn't需要覆盖getTestContainerFactory
and configureDeployment
如示例中所示。只需使用Application configure()
override 就足够了,只要不依赖 servlet 功能即可。
链接中的示例使用
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey.version}</version>
</dependency>
Extra
我链接到的两个示例都试图利用 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";
}
...
}