意外的JUnit行为

时间:2014-07-11 20:46:07

标签: java junit

我正在使用具有大量单元测试的Java Web应用程序。我们在Eclipse中运行单元测试。我正在进行测试并重构其中一些。我已经看到了一些像这样编写的测试(我将其归结为断言,我的文字示例实际上是测试中的变量)

assertEquals(new Integer(7), new Long(7));

这个测试通过!,我不明白为什么,因为类型不同。看到这种行为后,我在Eclipse中创建了一个简单的Java项目并编写了基本相同的单元测试

assertEquals(new Integer(7), new Long(7); 

它和我预期的失败了。我不需要任何帮助,我只是好奇测试在一个环境中如何通过而在另一个环境中失败(应该如此)。

1 个答案:

答案 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)所以这个断言会成功。