我正在使用具有大量单元测试的Java Web应用程序。我们在Eclipse中运行单元测试。我正在进行测试并重构其中一些。我已经看到了一些像这样编写的测试(我将其归结为断言,我的文字示例实际上是测试中的变量)
assertEquals(new Integer(7), new Long(7));
这个测试通过!,我不明白为什么,因为类型不同。看到这种行为后,我在Eclipse中创建了一个简单的Java项目并编写了基本相同的单元测试
assertEquals(new Integer(7), new Long(7);
它和我预期的失败了。我不需要任何帮助,我只是好奇测试在一个环境中如何通过而在另一个环境中失败(应该如此)。
答案 0 :(得分:1)
如果你看一下java.lang.Long的equals方法,它会说:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
所以new Long(7).equals(new Integer(7))
应该是false,因为Integer instanceof Long是false。该测试程序确认:
public class Stuff {
public static void main(String[] args) {
System.out.println("int equals long : " + new Integer(7).equals(new Long(7)));
System.out.println("long equals int : " + new Long(7).equals(new Integer(7)));
}
}
打印出来
int equals long : false
long equals int : false
我猜测得到相反结果的Web应用程序测试使用了ComparableAssert之类的附件,它有这个签名
public static void assertEquals(java.lang.Comparable expected,
java.lang.Comparable actual)
很容易误认为另一个,特别是如果测试使用静态导入。 Longs和Integers相互比较(new Long(7).compareTo(new Integer(7))
计算结果为0)所以这个断言会成功。