2016-11-21 164 views
1

我实现了基于Jersey的REST风格的Web服务。 当发送我的请求时,我首先检查是否定义了一些必需的参数,如果没有,我将返回带有错误代码和错误消息的响应。 下面是摘录:无法从http请求中获取JSON

@Path("/groups") 
@RequestScoped 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(value = {MediaType.APPLICATION_JSON, MediaType.TEXT_XML}) 
public class GroupResource 
{ 
    ... 
    @POST 
    public Response createGroup(Group group, @Context UriInfo uriInfo) 
    { 
    logger.info("-------------------"); 
    logger.info("Create group"); 
    logger.fine(group.toString()); 
    logger.info("-------------------"); 

    // check mandatory fields 
    if (!checkMandatoryFields(group, errorMessages)) 
    { 
     return Response.status(Status.BAD_REQUEST).entity(errorMessages).build(); 
    } 
    ... 
} 

然后我实现了一个JUnit测试来测试它:

@Test 
    public void testCreateGroup() 
    { 
    try 
    { 
     URL url = new URL(URL_GROUPS_WS); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", "application/json"); 

     String json2send = "{\"grid\":\"1\", \"gidNumber\":\"2\", \"groupName\":\"TestGroup\", \"groupDescription\":\"Initial description\", \"targetSystems\":[\"ADD TS1\"]}"; 

     OutputStream os = conn.getOutputStream(); 
     os.write(json2send.getBytes()); 
     os.flush(); 

     System.out.println("XXXXXXXX Sending request XXXXXXXX \n"); 

     if (conn.getResponseCode() != 200) 
     { 
     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     StringBuffer error = new StringBuffer(); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
     { 
      error.append(inputLine); 
     } 

     in.close(); 

     throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode() + error.toString()); 
     } 
    ... 
} 

我的问题是,我得到的responseCode,但我不知道怎么弄的错误消息,应该在响应中的某个地方,对吗? (Response.status(Status.BAD_REQUEST).entity(**errorMessages**).build())。

上面的代码,在那里我检查响应代码,不工作...

你能帮帮我吗?

+0

定义 “不工作” 精确。你期望发生什么,魔杖会发生什么呢? –

回答

0

相反InputStream的使用ErrorStream -

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getErrorStream())); 

ErrorStream会给你在错误的情况下的响应。

0

这不是如何正确测试球衣组件,你确实应该依靠Jersey Test Framework测试一个组成部分,它隐藏了许多复杂性,使得单元测试是很容易阅读和维护。

您目前的代码是太容易出错,应该避免

假设您使用的是maven,则需要使用test作用域将下2个依赖项添加到项目中。

<dependency> 
    <groupId>org.glassfish.jersey.test-framework</groupId> 
    <artifactId>jersey-test-framework-core</artifactId> 
    <version>2.24</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.test-framework.providers</groupId> 
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId> 
    <version>2.24</version> 
    <scope>test</scope> 
</dependency> 

然后,你可以简单地让你的单元测试扩展JerseyTest和覆盖的方法configure提供一流的其余部分的,它是对环境的设置完成。它会自动启动一个灰熊服务器并为你绑定你的组件,所以唯一要做的就是编写你的单元测试。

你的测试类可能是类似的东西:

public class GroupResourceTest extends JerseyTest { 

    @Override 
    protected Application configure() { 
     return new ResourceConfig(GroupResource.class); 
    } 

    @Test 
    public void testCreateGroup() { 
     Group group = // create your group instance to test here 
     Response response = target("/groups") 
      .request() 
      .accept(MediaType.APPLICATION_JSON) 
      .post(Entity.entity(group, MediaType.APPLICATION_JSON)); 
     Assert.assertEquals(Response.Status.BAD_REQUEST, response.getStatus()); 
     Assert.assertEquals("My error message", response.readEntity(String.class)); 
    } 
}