Java 不应该';t Mockito';什么叫eq? List-bucketList=newarraylist(50); //填充bucketList并使用它运行测试 验证(mockDao).createSomething(anyMapOf(Long.class,Long.class),eq(bucketList));

Java 不应该';t Mockito';什么叫eq? List-bucketList=newarraylist(50); //填充bucketList并使用它运行测试 验证(mockDao).createSomething(anyMapOf(Long.class,Long.class),eq(bucketList));,java,java-8,mockito,Java,Java 8,Mockito,ArrayList继承自AbstractList的equals调用其成员的“equals”,而“Bucket”实现“equals”。但是,调试器从不在Bucket的equals方法中停止。我错过什么了吗 顺便说一下,“eq”是org.mockito.Matchers.eq.实际上org.mockito.Matchers.eq使用org.mockito.internal.Matchers.Equality.areEqual(Object o1,Object o2)方法检查给定匹配器是否等于传递给该

ArrayList继承自AbstractList的equals调用其成员的“equals”,而“Bucket”实现“equals”。但是,调试器从不在Bucket的equals方法中停止。我错过什么了吗


顺便说一下,“eq”是org.mockito.Matchers.eq.

实际上
org.mockito.Matchers.eq
使用
org.mockito.internal.Matchers.Equality.areEqual(Object o1,Object o2)
方法检查给定匹配器是否等于传递给该方法的实际值。有趣的是,该方法的实施是从hamcrest偷来的,如评论中所述:

List<Bucket> bucketList = new ArrayList<Bucket>(50);
// Populate bucketList and use it to run the test
verify(mockDao).createSomething(anyMapOf(Long.class, Long.class), eq(bucketList));

在这个方法的最开始处放置一个断点,以查看您自己的代码中发生了什么。由于您将
ArrayList
传递给
eq()
的参数,因此您可能需要深入研究
ararraysequal
arrarylengthSequal
方法。

它可能会首先使用
=
检查标识,是的,它应该调用
equals
,但它只能保证调用
List.equals
(可能实际上是
AbstractList.equals
),如果引用相同或项目计数不同,则可能不会调用
Bucket.equals
。好的,我已经附加了源代码,调试器不会在AbstractList的equals的第一行停止(我有一个断点)在验证步骤停止后。加1用于指出它。尽管检查发生在“Equality”类的“areEqual”方法中。请注意:ArrayList不是数组。但这绝对是正确的方法,所以加1.)
//stolen from hamcrest because I didn't want to have more dependency than Matcher class 
//...
public static boolean areEqual(Object o1, Object o2) {
    if (o1 == o2 ) {
        return true;
} else if (o1 == null || o2 == null) {
        return o1 == null && o2 == null;
    } else if (isArray(o1)) {
        return isArray(o2) && areArraysEqual(o1, o2);
    } else {
        return o1.equals(o2);
    }
}