【发布时间】:2013-05-26 00:29:13
【问题描述】:
我正在尝试使用 assertEquals(s1,s2); 比较两个字符串; 我得到了比较错误 null 预期的。 帮我解决这个问题。?
【问题讨论】:
-
使用调试器确保两个字符串都不为空。或者在测试之前打印出这些值。
-
您是否有可能使用像here这样的unicode字符?
-
感谢您的建议。
我正在尝试使用 assertEquals(s1,s2); 比较两个字符串; 我得到了比较错误 null 预期的。 帮我解决这个问题。?
【问题讨论】:
(你没有说你使用的是什么版本的 JUnit,这可能很重要......虽然可能不是。)
这意味着单元测试有一个表达式,其计算结果为null,作为assertEquals 的expected 参数,而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 案件已处理...
【讨论】:
JUnit 调用 .equals() 方法来确定方法 assertEquals(Object o1, Object o2) 中的相等性。因此,使用 assertEquals(string1, string2) 绝对是安全的。 (因为字符串是对象)提供的两个对象都是非空的。另一种评估方法是使用 assertTrue:
assertTrue(s1.equals(s2));
【讨论】:
assertEquals 使用 Object.equals ... 这是比较字符串的正确方法。 (它不使用== ...阅读代码和javadocs。)。如果您实际上是在谈论使用assertTrue 的正确方法:1)这并不明显,2)assertTrue 是一个红鲱鱼,因为他没有使用它,3)无论如何这都是个坏主意;见 Pangea 的评论。