我遇到了一个问题,其中某些类 X 扩展了 java.util.AbstractMap,并且还重载了equals(Object)
。调用org.testng.Assert.assertEquals(X a, X b)
解析为assertEquals(Map<?,?>, Map<?,?>)
. 不是调用“equals”方法,而是比较映射条目。assertEquals(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
}
}
解决此问题的最佳方法是什么?一种可能性是记住不要使用assertEquals
来验证 X 的实例是否匹配,但这非常容易出错。
另一种可能性是简单地制作 testng 的本地副本并重命名重载。这会产生持续的维护问题。
我唯一的另一个想法是创建一个特定于项目的 Assert 类,该类委托给 testng.Assert 但将有问题的重载重命名为“assertCollectionEquals”、“assertMapEquals”等。