如何使用Mockito模拟方法链接

时间:2017-06-08 14:59:15

标签: java spring junit mockito

我的方法有以下代码。

getRequestedCapabilities(){
        ObjectMapper mapper = new ObjectMapper();

Capabilities capabilities = mapper.readValue(new 
 File(getClass().getClassLoader().getResource(jsonFilePath).getFile()), Capabilities.class);

}

在我的测试方法中,我准备了一个DTO(功能),mapper.readValue()在调用时需要返回。

Mockito.when(mapper.readValue(Mockito.mock(File.class),Mockito.eq(Capabilities.class))).thenReturn(capabilities);

但我得到一个例外,说无效使用匹配器。 你能建议我怎么做?这里的问题是如何模拟传递给mapper.readValue方法的参数,该方法具有方法调用链。

2 个答案:

答案 0 :(得分:0)

您可以简单地指定如果readValue收到任何参数,那么它将返回capabilities个对象。像这样:

ObjectMapper mapper = mock(ObjectMapper.class);
Mockito.when(mapper.readValue(any(), any())).thenReturn(capabilities);

但是如果你想更具体地使用模拟录音,你可以指定应该调用哪种类型的参数。像这样:

ObjectMapper mapper = mock(ObjectMapper.class);
Mockito.when(mapper.readValue(any(File.class), any(Capabilities.class))).thenReturn(capabilities);

更新: 您可以手动设置文件路径的值。最后,在单元测试中,您可以并且应该直接在测试中声明任何值。否则,您的测试不再是单元测试,因为您正在与其他组件进行交互。

答案 1 :(得分:0)

Mockito.when(mapper.readValue(Mockito.mock(File.class),Mockito.eq(Capabilities.class))).thenReturn(capabilities);

它来自Mockito.mock,当使用参数匹配器时,所有参数必须是匹配器。然后,您应该将Mockito.mock(File.class)替换为Mockito.any(File.class)Mockito.eq(a properly initialized mock)