繁体   English   中英

使用Mockito模拟通用类型

[英]Mocking Generic types using Mockito

我正在使用球衣使用JUnit和Mockito编写针对REST服务的测试用例。 我得到一个空对象,而不是Response类的模拟对象。

被测代码

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( ...

因此,您到达那里是:

  • 静态调用( Entity.entity()
  • 呼吁new

Mockito 无法模拟这两个操作。 它是如此简单。

为了模拟静态方法调用,您必须研究PowerMock(ito)或JMockit等框架。

但是我宁愿推荐另一种解决方案:考虑重新制作产品代码。 而是进行静态+新呼叫; 创建类似

interface EntityProvider {
  public Entity of(bytes[] data, MediaType type);
}

您可以轻松地创建一个使用当前代码的impl类-但出于测试目的,您可以依赖注入该接口的模型(通过Mockito.mock()创建); 突然之间,您的整个代码又可以在Mockito中进行测试了。

无需研究其他模拟框架(恕我直言;至少PowerMockito具有一定的成本-它不像“仅切换到其他框架”那样简单)。

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

上面的陈述给了我嘲笑的回应。 现在,我可以使用模拟的Response对象做任何我想做的事情。 我可以模拟getStatus方法并返回状态码或其他任何内容。

希望这对Mockito和PowerMockito Api的人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM