一部のクラス X が java.util.AbstractMap を拡張し、さらにオーバーロードを拡張するという問題が発生していequals(Object)
ます。呼び出しorg.testng.Assert.assertEquals(X a, X b)
は に解決されassertEquals(Map<?,?>, Map<?,?>)
ます。「equals」メソッドを呼び出す代わりに、マップ エントリが比較されます。これにより、falseassertEquals(a, b)
であっても合格になります。a.equals(b)
このコードは問題を示しています。
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.AbstractMap;
import java.util.Collections;
import java.util.Set;
import org.testng.annotations.Test;
public class AssertTest {
static class X extends AbstractMap<String, Object> {
private int i;
public X(int i) {
this.i = i;
}
@Override
public Set<Entry<String, Object>> entrySet() {
return Collections.EMPTY_SET;
}
@Override
public boolean equals(Object o) {
return o instanceof X && i == ((X)o).i;
}
@Override
public int hashCode() {
return i;
}
}
@Test
public void test() {
X one = new X(1);
X two = new X(2);
assertEquals(one, two); // passes, should fail IMO
assertTrue(one.equals(two)); // correctly fails
}
}
この問題を回避する最善の方法は何ですか? 1 つの可能性は、X のインスタンスが一致することを確認するために を使用しないことを覚えておくことassertEquals
ですが、これは非常にエラーが発生しやすいです。
もう 1 つの可能性は、単純に testng のローカル コピーを作成し、オーバーロードの名前を変更することです。これにより、継続的なメンテナンスの問題が発生します。
私が持っている他の唯一のアイデアは、testng.Assert に委譲するが、問題のあるオーバーロードの名前を「assertCollectionEquals」、「assertMapEquals」などに変更する、プロジェクト固有の Assert クラスを作成することです。