Mockito没有正确地将列表作为参数存根

时间:2015-10-28 14:21:05

标签: java unit-testing mockito stubbing argument-matcher

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

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

我在上面的方法ivocation嘲笑如下:

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

其中

 stubbedList 

是我通过插入两个整数1和3创建的列表。在实际调用中,我也传递了我构造的列表,其中包含整数1和3.这里的注释是stubbedList对象,而实际调用中的列表对象是不同的但是总是包含两个整数1和3。

stubbedMyClassInstanceList    

是MyClass实例的存根列表。

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

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

呼叫和实际通话,因此找不到正确的签名。

我无法使用

anyList() 

matcher因为我总是传递两个整数的列表(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)并且我使用的解决方案是正确的吗?

2 个答案:

答案 0 :(得分:5)

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

您认为有效的自定义参数匹配器不考虑订单。

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

答案 1 :(得分:0)

Mockito有一个eq()方法

你可以尝试:

import static org.mockito.Matchers.eq;

.....

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