好的,我进一步挖掘,发现这与任何特定的应用程序服务器无关。它可以在任何应用服务器上复制。
只需创建一个示例(junit4)测试用例,如下所述:
@Test
public void stringTest() {
org.junit.Assert.assertEquals("Comparing 2 string:", "abc", "xyz");
}
现在,从 Eclipse 运行它;您将看到结果为 1 次失败。使用ant(或 maven)目标通过某个应用服务器运行相同的操作,您将得到错误结果。
浏览日志后,我认为这一定是因为 junit4 org.junit.Assert.assertEquals(String message, Object expected,Object actual) 方法抛出了ComparisonFailure而不是AssertionError。我对此的分析是junit4 assert() 方法(org.junit.Assert.assertEquals(String, Object, Object)) 只对String 实例抛出ComparisonFailure。以下是 org.junit.Assert.assertEquals 的代码(junit4 assert 方法):
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);
}
这是 junit.framework.Assert.assertEquals(String, Object, Object) 的代码(即junit3 assert 方法)
static public void assertEquals(String message, Object expected, Object actual) {
if (expected == null && actual == null)
return;
if (expected != null && expected.equals(actual))
return;
failNotEquals(message, expected, actual);
}
可以观察到,在junit4 assertEquals()中,为不相等的 String 实例添加了一个额外的检查,这会为两个不相等的字符串抛出ComparisonFailure。对于所有其他不相等的对象,即 Integer、Long 等。调用将调用failNotEquals()方法,该方法会引发AssertionError。
谁能帮我理解在junit4的org.junit.Assert.assertEquals()方法中添加String实例检查的设计意义。为什么它真的被添加了,为什么只用于字符串?