JUnit for REST:无法POST数据

时间:2016-08-06 22:13:55

标签: java rest jersey

我想为REST端点编写一个JUnit类。

这是我的REST方法。它工作正常。

@POST
@Path("create")
@Produces(APPLICATION_JSON)
public String create(@QueryParam("parentId") String parentId, @QueryParam("name") String name) {
    //do sth.
    return "{\"status\": \"SUCCESS\"}";
}

现在我的JUnit测试看起来像那样,但是没有用,因为我不知道如何以正确的方式发布我的数据:

@Test
public void testCreate() {
    Client client = ClientBuilder.newClient();
    WebTarget wt = client.target(REST_MENU_URL + "create");
    String queryParams = "parentId=1&name=NEW_JUnit_NEW";
    // In the line below, I want to POST my query parameters, but I do it wrong 
    Response response = wt.request().post(Entity.entity(queryParams, APPLICATION_JSON), Response.class);
    // The response has a 500, because the query parameters are all NULL!
    assertEquals("Http code should be 200", 200, response.getStatus());
}

那么我该如何更改'响应'使它工作? 问题是,查询参数(parentId和name)不会被传输(response = wt.request()。post(...))。

我也尝试POST表单参数,但这里也没有成功。就像那样:

Form form =new Form().param("parentId", "4").param("name", "NEW_JUnit_NEW");
Response response = wt.request().post(Entity.entity(form, APPLICATION_JSON), Response.class);

谢谢, 哈德

1 个答案:

答案 0 :(得分:0)

查看Jersey Client文档,特别是有关定位资源的第5.3.4节。

查询参数构成资源URI的一部分,它们不是发布到资源的文档正文的一部分。您在资源中看到null,因为您未在URI中填写查询参数,而是将其作为正文发布。你需要告诉泽西岛将它们放在URI中......

WebTarget wt = client.target(REST_MENU_URL + "create").queryParam("parentId", 1).queryParam("name", "NEW_JUnit_NEW");

您还需要确保您的POST请求设置Accept标头以允许application / json(通过调用accept(...)后调用request()方法)并且您将继续需要构建某种实体来传递给post(...)方法 - 这里的问题是你的资源没有消耗实体主体但是客户端API希望你发送一些东西 - 这是代码气味,暗示你的API并不是特别的ReSTful。你可以通过一个空字符串构造的某种空体来逃脱。它应该看起来像这样......

Response response = wt.request().accept(MediaType.APPLICATION_JSON).post(Entity.text(""))

或者,您可以考虑转换API以使其接受JSON文档并将查询参数移动到该文档中。