【问题标题】:How to mock method chaining using Mockito如何使用 Mockito 模拟方法链接
【发布时间】:2017-06-08 14:59:15
【问题描述】:

我有一个方法,它的代码行如下。

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

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

}

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

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

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

【问题讨论】:

标签: java spring junit mockito


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    您可以简单地指定如果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);
    

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

    【讨论】:

    • 如果我直接给出文件的路径,它可以按照您建议的方法进行模拟。 code Capabilities capabilities = mapper.readValue(new File("C:\\Users\\krp2\\xACT Codebase\\Symphony-SDK\\system-starter-sdk\\" + "src\\capabilityregistrationrequest.json" ), Capabilities.class); code 但如果我使用问题中给出的方法调用链接,它无法模拟。获取空指针异常
    • 在你的方法链中返回null的方法是什么?
    • 您的测试资源中可能没有该文件。
    • 是的。 jsonFilePath 变量具有文件位置,它是通过如下所示的属性文件加载的。 @Value("${application.capabilities.json.path}") 私有字符串 jsonFilePath;但是在执行 junit 时不会加载属性。有什么建议吗?
    • 使用getClassLoader().getResource() 应该可以。只要确保你的 `main/test/resources' 文件夹中有那个 json 文件。
    猜你喜欢
    • 2020-12-08
    • 2020-03-20
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多