Man*_*Bey 9 unit-testing glassfish mockito jersey-client jersey-2.0
我在创建用于单元测试的模拟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);
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用手动创建的响应来模拟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而不是InboundResponse.后者是唯一允许使用该Response.readEntity()方法的人.如果是OutboundResponse,则抛出异常.
但是,我找不到任何方法将手动创建的响应转换为InboundResponse.所以我的测试注定失败了:(.你们这些人/ gals有什么想法我能在这里做什么吗?我不想用Mockito模仿Response对象,因为我认为这可能是代码味道,因为它违反了法律规定德米特.真诚地,我在这里没有想法.这样的事情应该简单明了.
您还可以使用 Mockito 模拟响应:
final Response response = Mockito.mock(Response.class);
Mockito.when(response.getStatus()).thenReturn(responseStatus);
Mockito.when(response.readEntity(Mockito.any(Class.class))).thenReturn(responseEntity);
Mockito.when(response.readEntity(Mockito.any(GenericType.class))).thenReturn(responseEntity);
Run Code Online (Sandbox Code Playgroud)
responseStatus 是与响应关联的状态代码, responseEnitty 当然是您想要返回的实体。您可以将该模拟用作 Mockito 中的返回语句(例如 ... thenReturn(response))。
在我的项目中,我为不同类型的模拟创建了构建器(在这种情况下是响应),因此我可以轻松按需构建所需的模拟,例如带有状态代码 200 和一些自定义实体的响应。
我有这个错误,因为当你使用ResponseBuilder它时,它返回一个OutboundJaxrsResponse无法处理的消息readEntity().
我注意到只有当我直接调用Jax-RS组件时才会出现此错误.例如,如果我已经DefaultController注释了@Path("/default"),如果我试图直接调用它的方法,我就无法使用readEntity()并且遇到与您相同的错误.
defaultController.get();
Run Code Online (Sandbox Code Playgroud)
现在,当我使用grizzly2测试提供程序并使用客户端来定位Rest Url时(在之前的情况下,它是/default),我在响应中收到的消息是ScopedJaxrsResponse.然后我可以使用这个readEntity()方法.
target("/default").request.get();
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您模拟了simpleClient,以便回复使用ResponseBuilder不由jersey处理的响应.它与直接调用我的DefaultController方法相当.
在没有嘲笑readEntity()方法的情况下,我建议你找到一种方法来让泽西岛处理你的回复,然后变成一个ScopedJaxrsResponse.
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
9197 次 |
| 最近记录: |