【问题标题】:What is Comparison Failure, null expected in JUnit?什么是比较失败,JUnit 中预期为空?
【发布时间】:2013-05-26 00:29:13
【问题描述】:

我正在尝试使用 assertEquals(s1,s2); 比较两个字符串; 我得到了比较错误 null 预期的。 帮我解决这个问题。?

【问题讨论】:

  • 使用调试器确保两个字符串都不为空。或者在测试之前打印出这些值。
  • 您是否有可能使用像here这样的unicode字符?
  • 感谢您的建议。

标签: java junit


【解决方案1】:

(你没有说你使用的是什么版本的 JUnit,这可能很重要......虽然可能不是。)

这意味着单元测试有一个表达式,其计算结果为null,作为assertEqualsexpected 参数,而actual 参数不计算为null

如果不查看您的代码,就不可能说出这真正意味着什么,但这可能是单元测试中的错误(例如,围绕错误方式的参数)或被测代码中的错误......或两者。至于为什么你会得到一个null,这取决于单元测试和/或它正在测试的代码。您需要通过查看源代码、使用调试器等进行自己的调查。

请注意assertEquals 方法(见下文)使用equals(不是==)比较对象,并注意避免抛出NPE,因为其中一个或两个参数都是null。所以那些建议你先测试null 的人没有抓住重点。

这是 Junit 4.4 代码:

static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null)
        return;
    if (expected != null && isEquals(expected, actual))
        return;
    else if (expected instanceof String && actual instanceof String) {
        String cleanMessage= message == null ? "" : message;
        throw new ComparisonFailure(cleanMessage, (String)expected, 
                                    (String)actual);
    }
    else
        failNotEquals(message, expected, actual);
    }
}

private static boolean isEquals(Object expected, Object actual) {
    return expected.equals(actual);
}

如您所见,null 案件已处理...

【讨论】:

    【解决方案2】:

    JUnit 调用 .equals() 方法来确定方法 assertEquals(Object o1, Object o2) 中的相等性。因此,使用 assertEquals(string1, string2) 绝对是安全的。 (因为字符串是对象)提供的两个对象都是非空的。另一种评估方法是使用 assertTrue:

    assertTrue(s1.equals(s2));
    

    【讨论】:

    • 实际上建议使用assertEquals而不是assertTrue来检查两个对象的相等性,因为断言失败时的消息更容易解释。
    • 这个说法也有问题:"assertEquals 检查对象的相等性。将字符串与相等性进行比较不是一个好主意"。事实上,assertEquals 使用 Object.equals ... 这是比较字符串的正确方法。 (它不使用== ...阅读代码和javadocs。)。如果您实际上是在谈论使用assertTrue 的正确方法:1)这并不明显,2)assertTrue 是一个红鲱鱼,因为他没有使用它,3)无论如何这都是个坏主意;见 Pangea 的评论。
    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 2020-10-16
    • 2015-05-21
    • 2011-09-29
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    相关资源
    最近更新 更多