java - Mockito 没有正确 stub 将列表作为参数的方法

标签 java unit-testing mockito stubbing argument-matcher

我正在尝试模拟一个类,并在调用模拟对象上的方法时返回 stub 对象列表。让我们考虑以下代码:

interface MyRepositry{
       public List<MyClass> getMyClassInstances(String str,Long id,List<Integer> statusList);
}

我模拟上面的方法调用如下:

when(myRepository.getMyClassInstances("1234", 200L, stubbedList)).thenReturn(stubbedMyClassInstanceList);

在哪里

 stubbedList 

是我通过插入两个整数 1 和 3 创建的列表。在实际调用中我还传递了我构造的具有整数 1 和 3 的列表。这里要注意的是 stubbedList 对象和实际调用中的列表对象是不同的但是总是包含两个整数 1 和 3。

stubbedMyClassInstanceList    

是 MyClass 实例的 stub 列表。

然而,当我运行测试时,mockito 返回一个空列表。我做了一些调试,我猜 mockito 无法匹配我在

中使用的列表对象
      when(..).thenReturn(..)

调用并在实际调用中,因此没有找到正确的签名。

我不能用

anyList() 

匹配器,因为我总是传递两个整数(1 和 3)的列表。

我已经通过使用自定义解决了这个问题

     ArgumentMatcher 

如下:

     class StatusMatcher extends ArgumentMatcher<List> {
    public boolean matches(Object list) {
        List statuses = ((List) list);
        return (statuses.size() == 2 && statuses.contains(1) && statuses.contains(3));
    }
}

所以问题是:

1) 我对为什么 stub /模拟不正确的猜测是正确的吗? 2) 我使用的解决方案是否正确?

最佳答案

Mockito 自然使用 equals()用于参数匹配。 equals() List<T> 中的方法指定如果两个列表包含相同顺序的相同元素,则它们被定义为相等。

您说有效的自定义参数匹配器没有考虑顺序。

所以可能 1 和 3 在 List<T> 中的顺序错误?

关于java - Mockito 没有正确 stub 将列表作为参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33393595/

相关文章:

java - 在 GWT 的 Java 或 PHP 之间进行选择!

unit-testing - 如何为 MockWebServer 设置默认响应?

java - 如何模拟应用程序上下文

java - 如何使用 Mockito 测试和模拟用 Java 编写的 GRPC 服务

java - 如何解决这段代码中的 ArrayIndexOutOfBoundsException?

java - 访问项目 lombok 注释方法时,Maven 构建找不到符号,

java - 如何使用 iText 在每个页面上添加总页码?

javascript - jest.doMock 和 JSON 导入模拟

PHPUnit 生成的测试骨架路径

java - 我想使用 spy 来模拟方法,但我需要获得一些虚拟数据作为返回