模拟或构建Jersey InboundJaxrsResponse



我是一个开发jersey客户端的新手,在一些测试中遇到了一些问题。首先,我可能应该提到,我的应用程序都是客户端的,根本没有服务器端的东西。

我的问题是,我想创建一个实例为InboundJaxrsResponseResponse对象,到目前为止,我已经尝试通过使用MockitoResponseBuilder.build() 模拟Response来实现这一点

使用Mockito:

Response response = mock(Response.class);
when(response.readEntity(InputStream.class))
    .thenReturn(ClassLoader.getSystemResourceAsStream("example_response.xml");

当我用response.readEntity(InputStream.class)读出响应的实体时,这很好我得到了预期的实体。但是,我需要从响应中多次读取实体。为了实现这一点,我在读出实体之前使用CCD_ 7。第一次读取实体时一切正常,但第二次收到异常I/O stream closed。。。好吧,我想出了模仿bufferEntity的方法,如下所示:

Response response = mock(Response.class);
when(response.bufferEntity()).thenCallRealMethod();
when(response.readEntity(InputStream.class))
    .thenReturn(ClassLoader.getSystemResourceAsStream("example_response.xml");

但这只会导致调用bufferEntity()时抛出错误,这是因为ResponsebufferEntity()abstract

我的另一个尝试是使用ResponseBuilder.build(),如下所示:

ResponseBuilder responseBuilder = Response.accepted(ClassLoader.getSystemResourceAsStream("example_response.xml"));
Response response = responseBuilder.build();

这个声明很好,通过调试我的响应,我可以看到它得到了正确的实体,等等。但这次当我调用response.bufferEntity()时,我抛出了一个异常,说该操作对OutboundJaxrsResponse来说是非法的,所以通过这种方式构建响应会导致Response.class:的错误实例

因此,这归结为三个问题。

  1. 这是模拟/构建这种类型的对象进行测试的方法吗
  2. 有没有一种方法可以模拟入站响应
  3. 有没有一种方法可以代替用ResponseBuilder.build()创建InboundJaxrsResponse的实例来创建OutboundJaxrsResponse的实例,或者至少将OutboundJaxrsResponse的实例转换为OutboundJaxrsResponse的实例

我用这种方式解决了:

@Spy Response response;
...
// for assignments in code under testing:
doReturn( response ).when( dwConnector ).getResource( anyString() );
// for entity and response status reading:
doReturn( "{a:1}".getBytes() ).when( response ).readEntity( byte[].class );
doReturn( 200 ).when( response ).getStatus();

相关内容

  • 没有找到相关文章

最新更新