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

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的列表。整数1和3。
stubbedMyClassInstanceList

是MyClass实例的存根列表。

但是,当我运行测试时,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)我对为何存根/模拟不起作用的猜测是否正确?
2)并且我使用的解决方案正确吗?

最佳答案

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

您所说的自定义参数匹配器不考虑顺序。

因此,也许1和3在List<T>中的顺序错误?

07-24 19:01
查看更多