我想为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);
谢谢, 哈德
答案 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文档并将查询参数移动到该文档中。