有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java意外的JUnit行为

我正在使用一个有很多单元测试的Java Web应用程序。我们在Eclipse中运行单元测试。我正在进行测试,并对其中一些进行重构。我见过一些这样编写的测试(我将把它归结为断言,我的文字示例实际上是测试中的变量)

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    如果你看看java的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,因为整数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),所以这个断言会成功