将2个不匹配的字符串对象的断言/比较记录为错误而不是失败

时间:2012-09-20 10:15:26

标签: ant junit junit4

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

问题是,当我从 eclipse 执行测试用例时,它将结果记录为失败,这是正确的,因为预期之间存在不匹配和实际的对象;
当我从 ant 执行相同的测试用例时,结果记录为错误
这真的很奇怪并且令人惊讶并且为了添加更多内容,这种行为在 junit 4 version only 上被注意到,当我在junit 3.8上执行测试用例时,ant和eclipse都记录了结果是失败。
对可能出错的任何建议或指示?
提前致谢:)

Ant-version:1.6.1 Junit版本:4.10

2 个答案:

答案 0 :(得分: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 断言方法)的代码:

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 断言方法)

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 。对于所有其他不等的对象,如整数,长整数等。调用转到 failNotEquals()方法,该方法抛出 AssertionError

任何人都可以帮助我理解在junit4的org.junit.Assert.assertEquals()方法中添加String实例检查的设计意义。为什么它真的被添加,为什么只有String?

答案 1 :(得分:1)

如上所述,测试结果行为的差异是因为 ant版本问题。对于较低版本的ant,您将获得此类行为(可能是因为较低的ant版本将 ComparisonFailure 视为错误而非失败)。 我在 ant version 1.7.1 (和更低版本)中发现了这种行为。但是在最新的 ant jar 1.8.4 中解决了问题。 当我在最新的ant版本上执行上述测试用例时,结果被记录为失败并且没有错误。 所以,如果您遇到这样的问题只需将您的ant jar更新为1.8.4 或其他最新版本。