爲作業創建測試,我收到一個奇怪的AssertionError
異常。爲什麼這個assertion引發AssertionError?
我已經改變了它,直到我到了一個簡單的例子:
List<Integer> elements= new ArrayList<Integer>();
elements.add(1);
elements.add(2);
elements.add(3);
Permutation p2 = new Permutation(elements);
Permutation p1 = new Permutation(elements);
assertThat(p2, equalTo(p1));
Permutation.java:
public class Permutation {
private List<Integer> elements;
public Permutation(List<Integer> elements) {
this.elements = elements;
}
public boolean equals(Permutacion permutation){
if (this.elements.size() != permutation.elements.size()){
return false;
}
Iterator<Integer> iterThis = this.elements.iterator();
Iterator<Integer> iterOther = permutation.elements.iterator();
while (iterThis.hasNext() && iterOther.hasNext()){
if (iterThis.next() != iterOther.next()){
return false;
}
}
return true;
}
兩個JUnit和hamcrest源代碼挖我發現,JUnit的assertThat只有電話在匹配器上匹配。
在這種情況下的匹配方法是:
public boolean matches(Object arg) {
return areEqual(arg, object);
}
private static boolean areEqual(Object o1, Object o2) {
if (o1 == null) {
return o2 == null;
} else if (o2 != null && isArray(o1)) {
return isArray(o2) && areArraysEqual(o1, o2);
} else {
return o1.equals(o2);
}
}
其中arg應該是 「P2」 和對象應爲 「P1」。
使用調試器的檢查,(它可以在Hamcrest repository可以瀏覽)
在areEqual方法比較的結果是:
"p2 == null" false
"p1 != null" true
"p2.getClass().isArray()" false
"p2.equals(p1)" true
"equalTo(p1).matches(p2)" false
因此,大家可以看到,代碼應達到最後其他條件並返回true
(p2.equals(p1)
),但equalTo(p1).matches(p2)
回報false
感謝您的幫助
對不起,我忘了在問題中添加它,但我已經擁有它。無論如何,我發佈的結果來自eclipse的表達式窗口,不僅僅是一個猜測 –
@JuanGuerrero:不,你*沒有*覆蓋'equals(Object)'。將編輯。 –
謝謝,它的工作。我會將你的答案標記爲已解決 –