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