代码之家  ›  专栏  ›  技术社区  ›  user85

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

  •  2
  • user85  · 技术社区  · 12 年前

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

    但问题是,当我从 日食 它将结果记录为 失败 这是正确的,因为预期对象和实际对象之间不匹配;
    而当我从 蚂蚁 ,结果记录为 错误
    这真的很奇怪和令人惊讶,更重要的是,这种行为在 仅限junit 4版本 ,当我在junit3.8上执行测试用例时,ant和eclipse都将结果记录为失败。
    关于可能出现的问题,有什么建议或建议吗?
    提前感谢:)

    Ant版本:1.6.1 Junit版本:4.10

    2 回复  |  直到 12 年前
        1
  •  1
  •   user85    12 年前

    好的,我深入研究了一下,发现这与任何特定的应用程序服务器都无关。它可以在 任何应用服务器
    只需创建一个示例(junit4)测试用例,如下所述:

    @Test
    public void stringTest() {
        org.junit.Assert.assertEquals("Comparing 2 string:", "abc", "xyz");
    }
    

    现在,从eclipse运行它;您将看到1次失败的结果。 使用 蚂蚁(或马文)目标 你会得到错误的结果。

    在浏览了日志之后,我认为这一定是因为junit4 org.junit.Assert.assertEquals(String message,Object expected,Object actual)方法抛出 对比失败 而不是 断言错误 。 我对此的分析是,junit4 assert()方法(org.junit.assert.assertEquals(String,Object,Object))只对String实例抛出ComparisonFailure。 以下是org.unit.Assert.assertEquals的代码( 6月4日 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)(即。 六月三日 断言方法)

    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实例添加了一个额外的检查 对比失败 对于两个不相等的字符串。对于所有其他不相等的对象,例如Integer、Long等。电话转到 failNotEquals()失败 抛出 断言错误

    有人能帮我理解吗 设计意义 在junit4的org.junit.Assert.assertEquals()方法中添加String实例检查。为什么它真的被添加了,为什么只针对String?

        2
  •  1
  •   user85    12 年前

    问题中提到的测试结果行为的差异是因为 ant版本问题 .对于较低版本的蚂蚁,你会得到这种类型的行为(可能是因为较低版本蚂蚁考虑 对比失败 作为错误而不是失败)。 我在中发现了这种行为 ant版本1.7.1 (和更低)。但是这个 问题解决了 最近 蚂蚁罐子 即。 1.8.4 。 当我在最新的ant版本上执行上述测试用例时 后果 被记录为 失败 非错误 。 所以,如果你遇到这样的问题 只需将你的ant jar更新到1.8.4 或其他可用的最新版本。