Why junit ComparisonFailure is not used by assertEquals(Object, Object) ?
Posted
by
Philippe Blayo
on Stack Overflow
See other posts from Stack Overflow
or by Philippe Blayo
Published on 2010-12-31T16:06:40Z
Indexed on
2011/01/01
9:54 UTC
Read the original article
Hit count: 250
In Junit 4, do you see any drawback to throw a ComparisonFailure instead of an AssertionError when assertEquals(Object, Object) fails ?
assertEquals(Object, Object) throws
- a
ComparisonFailureif both expected and actual are String - an
AssertionErrorif either is not a String
@Test(expected=ComparisonFailure.class )
public void twoString() {
assertEquals("a String", "another String");
}
@Test(expected=AssertionError.class )
public void oneString() {
assertEquals("a String", new Object());
}
The two reasons why I ask the question:
ComparisonFailureprovide far more readable way to spot the differences in dialog box of eclipse or Intellij IDEA (FEST-Assert throws this exception)- Junit 4 already use
String.valueOf(Object)to build message "expected ... but was ..." (format method invoqued by Assert.assertEquals(message, Object, Object) in junit-4.8.2):
static String format(String message, Object expected, Object actual) {
...
String expectedString= String.valueOf(expected);
String actualString= String.valueOf(actual);
if (expectedString.equals(actualString))
return formatted + "expected: "
+ formatClassAndValue(expected, expectedString) +" but was: "
+ formatClassAndValue(actual, actualString);
else
return formatted +"expected:<"+ expectedString +"> but was:<"+ actualString +">";
Isn't it possible in assertEquals(message, Object, Object) to replace
fail(format(message, expected, actual));
by
throw new ComparisonFailure(message,
formatClassAndValue(expectedObject, expectedString),
formatClassAndValue(actualObject, actualString));
Do you see any compatibility issue with other tool, any algorithmic problem with that... ?
© Stack Overflow or respective owner