6

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

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 实例的存根列表。

但是,当我运行测试时,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)我使用的解决方案是否正确?

4

2 回答 2

8

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

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

所以也许 1 和 3 的顺序是错误的List<T>

于 2015-10-28T14:34:44.490 回答
0

Mockito 有一个 eq() 方法

你可以试试:

import static org.mockito.Matchers.eq;

.....

when(myRepository.getMyClassInstances(eq("1234"), eq(200L), eq(stubbedList)).thenReturn(stubbedMyClassInstanceList);
于 2015-10-28T14:34:17.363 回答