在Junit 4中,当assertEquals(Object,Object)失败时,你是否看到抛出ComparisonFailure
而不是AssertionError
的任何缺点?
assertEquals(Object,Object)抛出
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讨论。]
答案 0 :(得分:9)
我们开始比较字符串,因为很明显如何使错误消息更有帮助。我们从未将ComparisonFailure扩展为一般对象,因为不清楚如何以一般方式这样做。正如其他人所建议的那样,如果您可以提供更好的错误消息或移动到Hamcrest,欢迎您添加特殊断言,Hamcrest提供了添加有用失败消息的一般机制。
此致
肯特
答案 1 :(得分:2)
我认为你可以编写自己的替代assertEquals方法来做到这一点而没有任何重大问题,如果这对你有用。
然而,在一般情况下(从框架开发人员的角度来看),这是一个好主意,我不确定。通常,失败对象不会有toString实现,此时来自IDE的失败消息将会产生误导。你会得到这样的印象:比较是在参考标识上,当它可能不存在时。
换句话说,如果对象具有有意义的toString实现是有价值的,否则它可能不是。
答案 2 :(得分:0)
我同意当前的JUnit实现,有两个异常类。主要是因为它使我们能够区分比较问题(ComparisonFailure
)和更“严重”类型的不兼容问题(AssertionError
)。
一般来说,Exception
内的短信只是人类的帮助,并不是任何软件工具都会触及的。这就是为什么抛出异常的类型发生问题的唯一指标。