jersey2 单元测试,HttpServletRequest 为空

2022-01-21 00:00:00 rest java jersey

请大家帮忙?

球衣错误连接:[1]:https://java.net/jira/browse/泽西-2412

jersey Bug connection: [1]: https://java.net/jira/browse/JERSEY-2412

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

The servlet request, response and context not injected into the class when I using test provider (tested jetty and grizzly2). I using packages annotation to pull up the application.


你还有什么办法吗?


Do you have any other way?

 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 + "
" +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 中,你应该有类似

You need to configure the JerseyTest for a Servlet environment. In your JerseyTest, you should have something like

@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 以编程方式.只需保持链接方法,然后构建.

If you look at the ServletDeploymentContext.forServlet, it returns a ServletDeploymentContext.Builder. If you look at the Javadoc, you will see some familiar looking methods, like initParam(...,...), addListener, etc. This is just like building your web.xml programmatically. Just keep chaining methods, then build.

通过上述配置,您不再需要重写JerseyTest中的configure方法.只需添加如上所示的 ResourceConfig.

With the above configuration, you no longer need to override the configure method in the JerseyTest. Just add the ResourceConfig like seen above.

查看其他测试示例这里

另见相关:

  • 如何对 Spring-Jersey 进行内存单元测试

相关文章