RestEasy:如何验证 ClientResponse 正文? [英] RestEasy: How to validate ClientResponse body?

查看:31
本文介绍了RestEasy:如何验证 ClientResponse 正文?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 REST 端点作为

I have a REST endpoint as

@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);
}

返回VariablePresentationListJSON.VariablePresentaion 看起来像

Which returns JSON of List of VariablePresentation. The VariablePresentaion looks like

@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;
    }

JAXBXmlRoot 注释以返回 JSON.我的集成测试如下

annotated with JAXB's XmlRoot to return JSON. My integration test is as following

@Test
public void testGetAllVariablesWithoutQueryParamPass() throws Exception {
    final ClientRequest clientCreateRequest = new ClientRequest("http://localhost:9090/variables");
    final MultivaluedMap<String, String> 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<String> clientCreateResponse = clientCreateRequest.post(String.class);
    assertEquals(201, clientCreateResponse.getStatus());
}

我想测试将 List 作为字符串返回的请求正文.如何将响应正文(字符串)转换为 VariablePresentation 对象?

I want to test the request body which returns the List<VariablePresentation> as String. How can I convert the response body (String) as VariablePresentation Object?

更新

添加以下内容后

        final GenericType<List<VariablePresentation>> typeToken = new GenericType<List<VariablePresentation>>() {
        };
        final ClientResponse<List<VariablePresentation>> clientCreateResponse = clientCreateRequest.post(typeToken);
        assertEquals(201, clientCreateResponse.getStatus());
        final List<VariablePresentation> 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<com.myorg.project.service.presentation.VariablePresentation>

我该如何解决这个问题?

How do I resolve this?

推荐答案

我发现的最简单的方法是使用 ClientResponse 和 Gson

The easiest way I found is to use ClientResponse with Gson

一个简单的例子可能是

  @Test
    public void testGetAllVariablesWithoutQueryParamNoPass() throws Exception {
        final ClientRequest clientCreateRequest_var0 = new ClientRequest("http://localhost:9090/variables?_activeonly=no");
        final MultivaluedMap<String, String> 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<String> clientCreateResponse_var0 = clientCreateRequest_var0.post(String.class);
        assertEquals(201, clientCreateResponse_var0.getStatus());

        final ClientRequest clientCreateRequest_var1 = new ClientRequest("http://localhost:9090/variables");
        final MultivaluedMap<String, String> 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<String> clientCreateResponse_var1 = clientCreateRequest_var1.post(String.class);
        assertEquals(201, clientCreateResponse_var1.getStatus());

        final ClientRequest clientCreateRequest2 = new ClientRequest("http://localhost:9090/variables");
        final ClientResponse<String> clientCreateResponse2 = clientCreateRequest2.get(String.class);

        final Gson gson = new Gson();
        final Type variableType = new TypeToken<List<VariablePresentation>>() {
        }.getType();
        List<VariablePresentation> variables = gson.fromJson(clientCreateResponse2.getEntity(), variableType);
        assertNotNull(variables);

        assertEquals(2, variables.size());

        // clean test data
        removeTestDataVariableObject(name0);
        removeTestDataVariableObject(name1);
    }

这篇关于RestEasy:如何验证 ClientResponse 正文?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆