我正在使用一个包含大量单元测试的 Java Web 应用程序。我们在 Eclipse 中运行单元测试。我正在经历测试并重构其中的一些。我见过一些像这样编写的测试(我将其归结为断言,我的文字示例实际上是测试中的变量)
assertEquals(new Integer(7), new Long(7));
这个测试通过了!,我不明白为什么,因为类型不同。看到这种行为后,我在 Eclipse 中创建了一个简单的 Java 项目,并编写了基本相同的单元测试
assertEquals(new Integer(7), new Long(7);
正如我所料,它失败了。我不需要任何帮助,我只是好奇测试如何在一种环境中通过而在另一种环境中失败(理应如此)。
最佳答案
如果您查看 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)
这很容易被误认为是另一个,特别是如果测试使用静态导入。 Long 和 Integer 相互比较(new Long(7).compareTo(new Integer(7))
计算结果为 0),因此此断言会成功。
关于java - 意外的 JUnit 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24706291/