java - 意外的 JUnit 行为

标签 java junit

我正在使用一个包含大量单元测试的 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/

相关文章:

java - Spring RestController - HTTP Status 400 客户端发送的请求在语法上不正确

java - junit 4.10如何在测试开始运行之前打印测试用例名称

java - 为什么 org.apache.xerces.parsers.SAXParser 不跳过 utf8 编码的 xml 中的 BOM?

java - 使用 Intellij 或 Maven 生成 SQLite 数据库进行单元测试?

android - 在 Eclipse android 中的项目(我们要测试的)中创建一个测试项目?

spring - Spring 3.1 Junit测试中获取WebApplicationContext

java - Junit无法读取更新后的代码

java - 在ant中使用junit

java - 在 Java 中找不到符号 - 构造函数

java - java 递归上限