2

我执行了一个简单的测试用例(在 jobss-ejb 环境中),它比较/断言 2 个字符串。
不幸的是,这些字符串彼此不匹配(有一个错误)。 但问题是,当我从eclipse

执行测试用例时,它会将结果记录为失败,这是正确的,因为预期对象和实际对象之间存在不匹配; 而当我从ant执行相同的测试用例时,结果被记录为error。 这真的很奇怪和令人惊讶,并且添加更多,这种行为仅在junit 4 版本上被注意到,当我在 junit 3.8 上执行测试用例时,ant 和 eclipse 都将结果记录为失败。


关于可能出现问题的任何建议或指示?
提前致谢 :)

Ant 版本:1.6.1 Junit 版本:4.10

4

2 回答 2

1

好的,我进一步挖掘,发现这与任何特定的应用程序服务器无关。它可以在任何应用服务器上复制。
只需创建一个示例(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实例检查的设计意义。为什么它真的被添加了,为什么只用于字符串?

于 2012-09-21T08:43:19.297 回答
1

问题中提到的测试结果行为的差异是因为ant 版本问题。对于较低版本的 ant,您会得到这种类型的行为(可能是因为较低的 ant 版本将比较失败视为错误而不是失败)。我在ant 版本 1.7.1(及更低版本)中发现了这种行为。但是这个问题在最新的ant jar1.8.4中得到了解决。当我在最新的 ant 版本上执行上述测试用例时,结果被记录为failure不是 error。因此,如果您遇到这样的问题,只需将您的 ant jar 更新到 1.8.4或其他可用的最新版本。

于 2012-09-24T14:46:54.580 回答