RestEasy:如何validationClientResponse正文?
我有一个REST
端点
@GET @Produces(MediaType.APPLICATION_JSON) public Response getVariables(@QueryParam("_activeonly") @DefaultValue("no") @Nonnull final Active active) { switch(active){ case yes: return Response.ok(VariablePresentation.getPresentationVariables(variableManager.getActiveVariables())).build(); case no: return Response.ok(VariablePresentation.getPresentationVariables(variableManager.getVariables())).build(); } throw new WebApplicationException(Response.Status.BAD_REQUEST); }
返回VariablePresentation
List
的JSON
。 VariablePresentaion
看起来像
@XmlRootElement public class VariablePresentation { private final UUID id; private final String name; private final VariableType type; public VariablePresentation(@Nonnull final Variable variable) { id = variable.getId(); name = variable.getName(); type = variable.getType(); } public String getId() { return id.toString(); } @Nonnull public String getName() { return name; } @Nonnull public VariableType getType() { return type; }
用JAXB
的XmlRoot
注释以返回JSON
。 我的集成测试如下
@Test public void testGetAllVariablesWithoutQueryParamPass() throws Exception { final ClientRequest clientCreateRequest = new ClientRequest("http://localhost:9090/variables"); final MultivaluedMap formParameters = clientCreateRequest.getFormParameters(); final String name = "testGetAllVariablesWithoutQueryParamPass"; formParameters.putSingle("name", name); formParameters.putSingle("type", "String"); formParameters.putSingle("units", "units"); formParameters.putSingle("description", "description"); formParameters.putSingle("core", "true"); final ClientResponse clientCreateResponse = clientCreateRequest.post(String.class); assertEquals(201, clientCreateResponse.getStatus()); }
我想测试请求体,它将List
作为String返回。 如何将响应体(String)转换为VariablePresentation
对象?
更新
添加以下内容后
final GenericType<List> typeToken = new GenericType<List>() { }; final ClientResponse<List> clientCreateResponse = clientCreateRequest.post(typeToken); assertEquals(201, clientCreateResponse.getStatus()); final List variables = clientCreateResponse.getEntity(); assertNotNull(variables); assertEquals(1, variables.size());
它失败了不同的错误
testGetAllVariablesWithoutQueryParamPass(com.myorg.project.market.integration.TestVariable): Unable to find a MessageBodyReader of content-type application/json and type java.util.List
我该如何解决这个问题?
我发现最简单的方法是使用ClientResponse和Gson
一个简单的例子可能是
@Test public void testGetAllVariablesWithoutQueryParamNoPass() throws Exception { final ClientRequest clientCreateRequest_var0 = new ClientRequest("http://localhost:9090/variables?_activeonly=no"); final MultivaluedMap formParameters = clientCreateRequest_var0.getFormParameters(); final String name0 = "testGetAllVariablesWithoutQueryParamNoPass_0"; formParameters.putSingle("name", name0); formParameters.putSingle("type", "String"); formParameters.putSingle("units", "units"); formParameters.putSingle("description", "description"); formParameters.putSingle("core", "true"); final ClientResponse clientCreateResponse_var0 = clientCreateRequest_var0.post(String.class); assertEquals(201, clientCreateResponse_var0.getStatus()); final ClientRequest clientCreateRequest_var1 = new ClientRequest("http://localhost:9090/variables"); final MultivaluedMap formParameters1 = clientCreateRequest_var1.getFormParameters(); final String name1 = "testGetAllVariablesWithoutQueryParamNoPass_1"; formParameters1.putSingle("name", name1); formParameters1.putSingle("type", "String"); formParameters1.putSingle("units", "units"); formParameters1.putSingle("description", "description"); formParameters1.putSingle("core", "true"); final ClientResponse clientCreateResponse_var1 = clientCreateRequest_var1.post(String.class); assertEquals(201, clientCreateResponse_var1.getStatus()); final ClientRequest clientCreateRequest2 = new ClientRequest("http://localhost:9090/variables"); final ClientResponse clientCreateResponse2 = clientCreateRequest2.get(String.class); final Gson gson = new Gson(); final Type variableType = new TypeToken>() { }.getType(); List variables = gson.fromJson(clientCreateResponse2.getEntity(), variableType); assertNotNull(variables); assertEquals(2, variables.size()); // clean test data removeTestDataVariableObject(name0); removeTestDataVariableObject(name1); }