【问题标题】:Mockito, verify and HashMap: Argument(s) are differentMockito、verify 和 HashMap:参数不同
【发布时间】:2020-02-27 20:43:16
【问题描述】:

使用 Mockito 的 verify 编写这样的测试:

verify(myClass, times(1)).myMethod("string_param", ObjectUtil.map("map_param_1", "value", "map_param_2", "10"))

ObjectUtil.map 是一个实用方法,它返回一个LinkedHashMap<String, Object>

我收到此错误:

参数不同!通缉:myClass.myMethod( “字符串参数”, (LinkedHashMap) {map_param_1=value, map_param_2=10} ); -> 在...

实际调用有不同的参数: 我的类.myMethod( “字符串参数”, (HashMap) {map_param_1=value, map_param_2=10} );

查看错误我会说等于失败,因为一侧有一个LinkedHashMap,另一侧有一个HashMap,但是更改类型并不能解决问题,而且参数看起来完全正确一样,会是什么?

【问题讨论】:

    标签: java android mockito


    【解决方案1】:

    我浪费了几个小时后解决了,我觉得Mockito的这种行为有点棘手。

    问题是由于 Maps 值的类型不匹配,在测试中我将“map_param_2”和“10”作为字符串传递,而在实际调用该方法时,参数是作为一个简单的 int 传递,但查看消息无法理解其中的区别,因为两者都写有 map_param_2=10

    爬上一些镜子后,我使用 Mockito 的argThat 写了一个自定义匹配器并循环地图的参数,我注意到它们属于不同类型。

    【讨论】:

    • 好发现!最近在类型不匹配方面看到了类似的问题——这是布尔类型与布尔类的对比。还有其他类似的类别,比如一个字符串被报告有和没有双引号,结果是关于这个不相等的。 - 在我的作品中,最后的线索还没有出来(这就是我来到这里的原因)。但是知道所报告的关于比较不匹配的提示是不完整的,因为只显示了值,但比较的类型被忽略了,这已经很重要了。 (这样做没有多大意义,但就是那样。)
    • PS:对于布尔值与布尔值,我必须在我的真/假值上使用类型转换前缀(布尔值)。
    【解决方案2】:

    问题是您有两个 Map 实例。在这种情况下,您必须创建变量 Map 然后在方法执行和验证时使用它。然后你会比较一个实例。 解决方案:

    String param = "string_param";
    Map<> map = ObjectUtil.map("map_param_1", "value", "map_param_2", "10");
    myClass.myMethod(param, map);
    verify(myClass, times(1)).myMethod(param , map);
    

    如果您想检查方法是否在不考虑参数的情况下执行,请尝试使用any() 功能。 导入静态 org.mockito.ArgumentMatchers.any;

    verify(myClass).myMethod(any(String.class), any(LinkedHashMap.class));
    

    只执行了一次:

    verify(myClass, times(1)).myMethod(any(String.class), any(LinkedHashMap.class));
    

    【讨论】:

    • 感谢 Misha,这是我的第一个“近似值”,但我还需要检查参数。无论如何,我已经添加了“解决方案”,我在 StackOverflow 上写了这个问题只是因为我在上面浪费了时间,而且我认为它可能对其他人有用。
    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多