为什么assertEquals(Object,Object)不使用junit ComparisonFailure?

时间:2010-12-31 16:06:41

标签: java unit-testing junit

在Junit 4中,当assertEquals(Object,Object)失败时,你是否看到抛出ComparisonFailure而不是AssertionError的任何缺点?

assertEquals(Object,Object)抛出

     如果预期和实际都是字符串,则
  • a ComparisonFailure  
  • AssertionError如果其中一个不是字符串

AssertionError消息的格式已经是

"expected:<"+ expected.toString() +"> but was <"+ actual.toString()

(通过String.valueOf,参见下面由Assert.assertEquals(Object,Object)调用的junit-4.8.2方法来构建AssertionError消息):

static String format(Object expected, Object actual) {
    ...
    String expectedString= String.valueOf(expected);
    String actualString=   String.valueOf(actual);
    ...
    return formatted+"expected:<"+ expectedString +"> but was:<"+ actualString +">";

ComparisonFailure提供了更易读的方法来发现eclipse或Intellij IDEA对话框中的差异(FEST-Assert抛出此异常)

[更新:编辑的问题专注于ComparisonFailure / AssertionError讨论。]

3 个答案:

答案 0 :(得分:9)

我们开始比较字符串,因为很明显如何使错误消息更有帮助。我们从未将ComparisonFailure扩展为一般对象,因为不清楚如何以一般方式这样做。正如其他人所建议的那样,如果您可以提供更好的错误消息或移动到Hamcrest,欢迎您添加特殊断言,Hamcrest提供了添加有用失败消息的一般机制。

此致

肯特

答案 1 :(得分:2)

我认为你可以编写自己的替代assertEquals方法来做到这一点而没有任何重大问题,如果这对你有用。

然而,在一般情况下(从框架开发人员的角度来看),这是一个好主意,我不确定。通常,失败对象不会有toString实现,此时来自IDE的失败消息将会产生误导。你会得到这样的印象:比较是在参考标识上,当它可能不存在时。

换句话说,如果对象具有有意义的toString实现是有价值的,否则它可能不是。

答案 2 :(得分:0)

我同意当前的JUnit实现,有两个异常类。主要是因为它使我们能够区分比较问题(ComparisonFailure)和更“严重”类型的不兼容问题(AssertionError)。

一般来说,Exception内的短信只是人类的帮助,并不是任何软件工具都会触及的。这就是为什么抛出异常的类型发生问题的唯一指标。