課題のテストを作成すると、奇妙な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));
順列.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 はマッチャーでのみ一致を呼び出すことがわかりました。
この場合の Match メソッドは次のとおりです。
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」、object は「p1」である必要があります。
( Hamcrestリポジトリで閲覧可能)
デバッガー インスペクションを使用した areEqual メソッドでの比較の結果は次のとおりです。
"p2 == null" false
"p1 != null" true
"p2.getClass().isArray()" false
"p2.equals(p1)" true
"equalTo(p1).matches(p2)" false
ご覧のとおり、コードは最後の else 条件に到達してtrue
( p2.equals(p1)
) を返す必要がequalTo(p1).matches(p2)
ありますが、false
ご協力いただきありがとうございます