使用Mockito模拟通用类型



我正在使用Junit和Mockito编写一个测试案例,并使用Jersey进行休息服务。我得到了一个零对象,而不是响应类的模拟对象。

测试中的代码

Response response = builder
                        .put( Entity.entity( new ByteArrayInputStream( jsonObj.toString().getBytes() ), MediaType.APPLICATION_JSON ), Response.class );

测试案例:

private Invocation.Builder builder; 
private Entity<ByteArrayInputStream> inputStream;
private Response response;
@Before
public void setUp() throws Exception {
    builder = mock( Invocation.Builder.class );
    inputStream = (Entity<ByteArrayInputStream>)mock( Entity.class );
    response = mock( Response.class );
}
@Test
public void myTest() {
when( builder.put( inputStream, Response.class ) ).thenReturn( response );
}

因此,这条代码使我响应无效。还有其他方法吗?

谢谢。

那是因为您正在混合各种东西。

您的生产代码确实:

Entity.entity( new ByteArrayInputStream( ...

所以,你到达那里的是:

  • a 静态呼叫(Entity.entity()(
  • 致电new

这两个操作不能用Mockito模拟。它是如此简单。

为了模拟静态方法调用,您必须查看诸如PowerMock(ITO(或JMOCKIT之类的框架。

,但我宁愿建议一个不同的解决方案:考虑重新加工您的生产代码。而是进行静态 新调用;创建

之类的东西
interface EntityProvider {
  public Entity of(bytes[] data, MediaType type);
}

您可以轻松地创建使用当前代码的IMPH类 - 但是对于 testing 目的,您可以依赖该接口的模拟(通过mockito.mock((创建(;突然之间,您的整个代码再次可以通过Mockito进行测试。

并且无需查看其他模拟框架(和恕我直言;至少PowerMockito都带有一定数量的成本 - 它不像"只需切换到其他框架"那么简单(。

我已经解决了这个问题,所以我想分享了我实际上所做的事情。 Mockito.when(builder.put(any(Entity.class), any(Class.class))).thenReturn(response);

上面的语句给了我模拟的回应。现在,我可以使用模拟的响应对象做任何我想做的事情。我可以模拟GetStatus方法并返回状态代码或其他任何内容。

希望这有助于那些嘲讽和Powermockito API的人。

相关内容

  • 没有找到相关文章

最新更新