模拟或构建Jersey InboundJaxrsResponse

时间:2014-09-15 09:19:14

标签: java unit-testing jersey java-ee-7 jersey-client

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

我的问题是我想创建一个实例Response的{​​{1}}对象,到目前为止,我已尝试使用{{1}模拟InboundJaxrsResponse来实现此目的}和Response

使用Mockito:

Mockito

当我用ResponseBuilder.build()读出回复的实体时,这很好用 我得到了预期的实体。但是我需要多次从响应中读取实体。为了实现这一点,我在读出实体之前使用了Response response = mock(Response.class); when(response.readEntity(InputStream.class)) .thenReturn(ClassLoader.getSystemResourceAsStream("example_response.xml"); 。我第一次阅读实体一切正常,但第二次我得到异常response.readEntity(InputStream.class) ... 好吧,我想出了嘲笑方法response.bufferEntity()以及如下:

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"); 的{​​{1}}为bufferEntity()

我的另一种尝试是使用bufferEntity(),如下所示:

Response

这个声明很好,通过调试我的响应我可以看到它有正确的实体等等。但是这次当我调用abstract时,我得到一个例外,说明该操作对于ResponseBuilder.build()是非法的,所以通过以这种方式构建响应导致错误的ResponseBuilder responseBuilder = Response.accepted(ClassLoader.getSystemResourceAsStream("example_response.xml")); Response response = responseBuilder.build(); 实例:

所以最终有三个问题。

  1. 这是否可以模拟/构建此类型的对象进行测试?
  2. 有没有办法模拟入站响应?
  3. 是否有办法创建response.bufferEntity() OutboundJaxrsResponse的实例而不是创建Response.class的实例,或者至少将OutboundJaxrsResponse的实例转换/转换为ResponseBuilder.build()的实例?

1 个答案:

答案 0 :(得分:3)

我这样解决了:

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