为什么我在这里用anyInt()检测到Mockito错位的参数匹配器?

Gré*_*rel 1 java mockito indexoutofboundsexception

Mockito.when(metadataDao.getStuff(Mockito.anyInt()).get(Mockito.anyInt()))
               .thenReturn(returnedVariable);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.LinkedList.checkElementIndex(LinkedList.java:555)
    at java.util.LinkedList.get(LinkedList.java:476)
    at 
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用匹配器?

dur*_*597 7

Mockito.anyInt()通过副作用起作用; 当它将值传递给实际类时,它实质上发送0.

它看起来像是metadataDao.getStuff返回一个真实的LinkedList,大小为0.然后,你发送的数量0是真实的LinkedList,它调用get大小为0 的真实方法,你得到你期望的正常错误.

你可以避免在Mockito中使用链式方法调用来避免这样的问题,换句话说,永远不会:

when(obj.methodOne().methodTwo())
Run Code Online (Sandbox Code Playgroud)

相反,只需使用一个方法调用.在您的示例中,这可能是:

List<MyObj> mockList = Mockito.mock(List.class);
Mockito.when(metadataDao.getStuff(Mockito.anyInt()).thenReturn(mockList);
Mockito.when(mockList.get(Mockito.anyInt())).thenReturn(returnedVariable);
Run Code Online (Sandbox Code Playgroud)

还要注意,正如@JeffBowman在评论中指出的那样,你应该永远不会嘲笑List真实的List意志.