Mockito 的 eq 调用不应该等于吗?
Shouldn't Mockito's eq call equals?
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 的 equals 继承自 AbstractList 调用其成员的 "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 窃取的,如评论中所述:
//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);
}
}
在这个方法的最开头放置一个断点,看看你自己的代码中发生了什么。由于您将 ArrayList
传递给 eq()
的参数,因此您可能需要更深入地研究 areArraysEqual
和 areArrayLengthsEqual
方法。
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 的 equals 继承自 AbstractList 调用其成员的 "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 窃取的,如评论中所述:
//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);
}
}
在这个方法的最开头放置一个断点,看看你自己的代码中发生了什么。由于您将 ArrayList
传递给 eq()
的参数,因此您可能需要更深入地研究 areArraysEqual
和 areArrayLengthsEqual
方法。