gpt4 book ai didi

unit-testing - 无法模拟 Glassfish Jersey 客户端响应对象

转载 作者:行者123 更新时间:2023-12-04 02:51:44 25 4
gpt4 key购买 nike

我在创建用于单元测试的模拟 Response 对象时遇到问题。我正在使用 org.glassfish.jersey.core.jersey-client版本 2.3.1 来实现我的 RESTful 客户端和 mockito版本 1.9.5 帮助我处理模拟对象。这是我的测试代码:

@Test
public void testGetAll() throws IOException {
// Given
String expectedResource = "expectedResource"

final Response expectedRes = Response.ok(expectedResource, MediaType.APPLICATION_JSON).build();
String receivedResource;

BDDMockito.given(this.client.getSimpleClient().getAllWithResponse()).willReturn(expectedRes);

// When
receivedResource = this.client.getAll();

// Then
Assert.assertNotNull("Request constructed correctly and response received.", receivedResource);
Assert.assertEquals("Resource is equal to expected.", expectedResource, receivedResource);
}
this.client.getAll();时出现问题被执行。这是该方法的代码:
public String getAll() throws GenericAragornException, ProcessingException{
Response response = this.simpleClient.getAllWithResponse();

if (response.getStatus() != 200) {
processErrorResponse(response);
}

String entity = response.readEntity(String.class);

// No errors so return entity converted to resourceType.
return entity;
}

请注意,我正在使用手动创建的响应来模拟 this.simpleClient.getAllWithResponse() 方法。当它到达 response.readEntity(resourceListType);指令,Jersey 抛出以下异常: java.lang.IllegalStateException - Method not supported on an outbound message. .经过大量研究和调试后,由于某种原因,当我使用诸如 Response.ok(expectedResource, MediaType.APPLICATION_JSON).build(); 之类的响应构建器创建响应时,结果是这样的。它将它创建为 OutboundResponse 而不是 入站响应 .后者是唯一被允许使用 Response.readEntity() 的人。方法。如果是 出站响应 ,抛出异常。

但是,我找不到任何将手动创建的响应转换为 InboundResponse 的方法。所以我的测试注定要失败:(。你们/女孩知道我可以在这里做什么吗?我不想用 Mockito 来模拟 Response 对象,因为我认为它可能是一种代码气味,因为它违反了德米特。我真的没有想法。像这样的事情应该简单明了。

最佳答案

我有这个错误,因为当你使用 ResponseBuilder 时,它返回一个 OutboundJaxrsResponse无法使用 readEntity() 处理的消息.

我注意到只有在我直接调用 Jax-RS 组件时才会出现此错误。例如,如果我有 DefaultController@Path("/default") 注释如果我试图直接调用它的方法,我就不能使用 readEntity()和你有同样的错误。

defaultController.get();

现在,当我使用 grizzly2 测试提供程序并使用客户端定位 Rest Url(在前一种情况下,它是 /default )时,我收到的响应消息是 ScopedJaxrsResponse。然后我可以使用 readEntity()方法。
target("/default").request.get();

在您的情况下,您模拟了 simpleClient 以便回复由 ResponseBuilder 构建的响应。未经 Jersey 处理。相当于直接调用我的 DefaultController方法。

没有 mock readEntity()方法,我建议你想办法让Jersey处理你的回复并变成 ScopedJaxrsResponse .

希望有帮助。

关于unit-testing - 无法模拟 Glassfish Jersey 客户端响应对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19557672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com