java – jersey2单元测试,HttpServletRequest为null

请大家帮忙?

泽西Bug连接:[1]:https://java.net/jira/browse/JERSEY-2412

当我使用测试提供程序(测试的jetty和grizzly2)时,servlet请求,响应和上下文没有注入到类中.
我使用包注释来提取应用程序.

你有其他方法吗?

 public class VMResourceTest extends BaseTest {  

    @Test  
    public void testCreateVm() {  

    String bodyData = loadClassPathData(CLASS_PATH+File.separator+"tools"+File.separator+"createVm.json");  
        Response response = target("/tool/cloud/vrm/fm/ghca_vms").queryParam("platform_id", "A22A4B0C3AEC49F5916EA8CC01F56E9A")  
                    .request().header("X-Auth-GHCA-User-ID", "X-Auth-GHCA-User-ID")  
                    .post(Entity.entity(bodyData, MediaType.APPLICATION_JSON));  
        assertEquals("200", response.getStatus());  
    }  
} 
    public class BaseTest extends JerseyTest{  
       public String CLASS_PATH = "classpath:";  
       public WebTarget target;  
       public Client client;  

      @Override  
      protected Application configure() {  
        enable(TestProperties.LOG_TRAFFIC);  
        enable(TestProperties.DUMP_ENTITY);  
        ResourceConfig rc = new    ResourceConfig().packages("com.ghca.easyview.server.api.resource");  
        rc.register(SpringLifecycleListener.class);  
        rc.register(RequestContextListener.class);  

        rc.property("contextConfigLocation", "classpath:spring/spring-config.xml");  
        return rc;  
    }  



        public String loadClassPathData(String classFilePath){  
           File schemaContextFile = null;  
           String result = "";  
        try {  
            schemaContextFile = readSchemaFile(classFilePath);  
            BufferedReader br = new BufferedReader(new  FileReader(schemaContextFile));
            String s = null;  
            while((s = br.readLine())!=null){ 
                result = result + "\n" +s;  
            }  
            br.close();      
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return result;  
    }  
    }
    @Component  
    @Path("tool/cloud/vrm")  
    public class VMResource extends BaseResource{  

    @Autowired  
    private VMService vmService;  

    @Context  
    public HttpServletRequest request;  
    @Context  
    public HttpServletResponse response;  


    @POST  
    @Path("{platform_type}/ghca_vms")  
    @Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})  
    @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})  
    public Response createVm(@PathParam("platform_type") String platformType,  
            @QueryParam("platform_id") String platformId) {}  

请求和响应为空.

解决方法:

您需要为Servlet环境配置JerseyTest.在你的JerseyTest中,你应该有类似的东西

@Override
protected TestContainerFactory getTestContainerFactory() {
    return new GrizzlyWebTestContainerFactory();
}

@Override
protected DeploymentContext configureDeployment() {
    ResourceConfig config = new ResourceConfig(SessionResource.class);
    return ServletDeploymentContext.forServlet(
                             new ServletContainer(config)).build();
}

如果查看ServletDeploymentContext.forServlet,它将返回一个ServletDeploymentContext.Builder.如果查看Javadoc,您将看到一些熟悉的方法,如initParam(…,…),addListener等.这就像构建一样你的web.xml以编程方式.只需保持链接方法,然后构建.

使用上面的配置,您不再需要覆盖JerseyTest中的configure方法.只需添加如上所示的ResourceConfig.

参见其他测试示例here

另见相关:

> How to in-memory unit test Spring-Jersey

上一篇:Java Jersey REST请求参数卫生


下一篇:java – 如何干净地检查HTTP返回代码是在服务器端异常代码系列中