Java 意外的JUnit行为

Java 意外的JUnit行为,java,junit,Java,Junit,我正在使用一个有很多单元测试的JavaWeb应用程序。我们在Eclipse中运行单元测试。我正在进行测试并重构其中的一些。我见过一些这样编写的测试(我将把它归结为断言,我的文字示例实际上是测试中的变量) 这个测试通过了!,我不明白为什么,因为类型不同。在看到这种行为之后,我在Eclipse中创建了一个简单的Java项目,并编写了基本相同的单元测试 assertEquals(new Integer(7), new Long(7); 正如我所料,它失败了。我不需要任何帮助,我只是好奇测试如何在一

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

这个测试通过了!,我不明白为什么,因为类型不同。在看到这种行为之后,我在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,因为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应用程序测试得出了相反的结果,它使用了一个像这样的附加组件,它有这样的特征

public static void assertEquals(java.lang.Comparable expected,
                                 java.lang.Comparable actual)

这很容易被误认为是另一个,特别是当测试使用静态导入时。Long和Integer是可比较的(
new Long(7)。compareTo(new Integer(7))
计算为0),因此该断言将成功。

如果包含实际代码,将更容易帮助您。您确定它们都是
java.lang.Integer
s吗?如果不是,也许自定义类可以重写equals方法。。。。毫无疑问,这是一个不太可能的解释。除非您能提供
Integer
long
的完全限定名,否则我们将在这里抓住救命稻草。我同意@EdwinBuck的观点,因为这可能是覆盖其中一个类的东西,但我不确定是什么,也不确定为什么。另一个远大目标(但我真的不认为会发生)是,在某种程度上,一个可以绑定到一个值(可能通过自动装箱),而另一个最终将转换为int。同时,您确实注意到在发布的第二个单元测试中缺少了一个括号,对吗?我同意,看到真正的测试会很好,特别是在
导入
和版本时;例如,您使用JUnit上的哪个版本?原始测试和您的宠物演示是否相同?断章取义,因为您正在重构,所以请去掉
newinteger
(或
Long
Double
,等等)并改用
valueof
,因为缓存有问题。
public static void assertEquals(java.lang.Comparable expected,
                                 java.lang.Comparable actual)