我是一个开发jersey客户端的新手,在一些测试中遇到了一些问题。首先,我可能应该提到,我的应用程序都是客户端的,根本没有服务器端的东西。
我的问题是,我想创建一个实例为InboundJaxrsResponse
的Response
对象,到目前为止,我已经尝试通过使用Mockito
和ResponseBuilder.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()
时抛出错误,这是因为Response
的bufferEntity()
是abstract
。
我的另一个尝试是使用ResponseBuilder.build()
,如下所示:
ResponseBuilder responseBuilder = Response.accepted(ClassLoader.getSystemResourceAsStream("example_response.xml"));
Response response = responseBuilder.build();
这个声明很好,通过调试我的响应,我可以看到它得到了正确的实体,等等。但这次当我调用response.bufferEntity()
时,我抛出了一个异常,说该操作对OutboundJaxrsResponse
来说是非法的,所以通过这种方式构建响应会导致Response.class
:的错误实例
因此,这归结为三个问题。
- 这是模拟/构建这种类型的对象进行测试的方法吗
- 有没有一种方法可以模拟入站响应
- 有没有一种方法可以代替用
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();