Mockito 没有正确存根将列表作为参数的方法
Mockito doesn't correctly stub methods taking list as argument
我试图在调用模拟对象上的方法时模拟 class 和 return 存根对象列表。让我们考虑以下代码:
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 return 一个空列表。我做了一些调试,我猜 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) 我对 stubbing/mocking 不工作的原因的猜测是否正确?
2) 我使用的解决方案是否正确?
Mockito 有一个 eq() 方法
你可以试试:
import static org.mockito.Matchers.eq;
.....
when(myRepository.getMyClassInstances(eq("1234"), eq(200L), eq(stubbedList)).thenReturn(stubbedMyClassInstanceList);
Mockito 自然使用 equals()
进行参数匹配。 List<T>
中的 equals()
方法指定如果两个列表包含相同顺序的相同元素,则它们被定义为相等。
您说有效的自定义参数匹配器没有考虑顺序。
所以可能 1 和 3 在 List<T>
中的顺序错误?
我试图在调用模拟对象上的方法时模拟 class 和 return 存根对象列表。让我们考虑以下代码:
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 return 一个空列表。我做了一些调试,我猜 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) 我对 stubbing/mocking 不工作的原因的猜测是否正确? 2) 我使用的解决方案是否正确?
Mockito 有一个 eq() 方法
你可以试试:
import static org.mockito.Matchers.eq;
.....
when(myRepository.getMyClassInstances(eq("1234"), eq(200L), eq(stubbedList)).thenReturn(stubbedMyClassInstanceList);
Mockito 自然使用 equals()
进行参数匹配。 List<T>
中的 equals()
方法指定如果两个列表包含相同顺序的相同元素,则它们被定义为相等。
您说有效的自定义参数匹配器没有考虑顺序。
所以可能 1 和 3 在 List<T>
中的顺序错误?