JUnit 消息的格式化
Formatting of JUnit Messages
使用 JUnit assertEquals()
,我正在比较可能有 whitespace/control 个字符不同的字符串。
特别是,“\r\n”与“\n”。
当字符串以这种方式不同时,assertEquals()
的错误输出由于某些原因难以解释。
- 它们是空白字符,不适合目测
- \r 字符导致输出被覆盖。
此示例说明如果字符串中没有任何特殊字符,您通常如何测试该字符串
*/
@Test
public void testIfTheCarriageReturned()
{
final String expected = "we're taking\r\n the hobbits\r\n to Isengard!";
final String actual = "we're taking\n the hobbits\n to Isengard!";
assertEquals(expected, actual);
}
这个例子正确地确定了字符串不同但是
JUnit 的输出没有明确说明它们之间的区别(空白未以任何特殊方式处理)。
有没有办法让 JUnit 产生更合适的输出?
老实说,我想这与格式无关,而是与正确编写测试有关。我从来没有关心过 Junit5 的新特性,因此可能有一种新的超级聪明的方法来实现这一点,但是是的:
@Test
public void testIfTheCarriageReturned()
{
/**
* This is how you'd normally test string if you wouldn't have any special chars within
*/
final String expected = "we're taking\r\n the hobbits\r\n to Isengard!";
final String linuxGuy = "we're taking\n the hobbits\n to Isengard!";
//assertEquals(expected, linuxGuy);
/**
* Just do it charwise...
*/
for(int i = 0; i<expected.length(); i++)
{
assertEquals("Character differed at index "+i,Character.getName(expected.charAt(i)), Character.getName(linuxGuy.charAt(i)));
}
}
这基本上只是获取字符的名称并比较它们在同一索引处是否相等。
这将导致以下输出:
org.junit.ComparisonFailure: Character differed at index 12 expected:<[CARRIAGE RETURN (CR])> but was:<[LINE FEED (LF])>
at org.junit.Assert.assertEquals(Assert.java:117)
补充一下:
当实际字符串比预期字符串长时,这将导致通过测试。您可以随后检查长度,也可以在循环后的两个字符串上使用 assertEquals 方法。口味问题,我可能更喜欢后者。
使用 JUnit assertEquals()
,我正在比较可能有 whitespace/control 个字符不同的字符串。
特别是,“\r\n”与“\n”。
当字符串以这种方式不同时,assertEquals()
的错误输出由于某些原因难以解释。
- 它们是空白字符,不适合目测
- \r 字符导致输出被覆盖。
此示例说明如果字符串中没有任何特殊字符,您通常如何测试该字符串 */
@Test
public void testIfTheCarriageReturned()
{
final String expected = "we're taking\r\n the hobbits\r\n to Isengard!";
final String actual = "we're taking\n the hobbits\n to Isengard!";
assertEquals(expected, actual);
}
这个例子正确地确定了字符串不同但是 JUnit 的输出没有明确说明它们之间的区别(空白未以任何特殊方式处理)。
有没有办法让 JUnit 产生更合适的输出?
老实说,我想这与格式无关,而是与正确编写测试有关。我从来没有关心过 Junit5 的新特性,因此可能有一种新的超级聪明的方法来实现这一点,但是是的:
@Test
public void testIfTheCarriageReturned()
{
/**
* This is how you'd normally test string if you wouldn't have any special chars within
*/
final String expected = "we're taking\r\n the hobbits\r\n to Isengard!";
final String linuxGuy = "we're taking\n the hobbits\n to Isengard!";
//assertEquals(expected, linuxGuy);
/**
* Just do it charwise...
*/
for(int i = 0; i<expected.length(); i++)
{
assertEquals("Character differed at index "+i,Character.getName(expected.charAt(i)), Character.getName(linuxGuy.charAt(i)));
}
}
这基本上只是获取字符的名称并比较它们在同一索引处是否相等。
这将导致以下输出:
org.junit.ComparisonFailure: Character differed at index 12 expected:<[CARRIAGE RETURN (CR])> but was:<[LINE FEED (LF])>
at org.junit.Assert.assertEquals(Assert.java:117)
补充一下: 当实际字符串比预期字符串长时,这将导致通过测试。您可以随后检查长度,也可以在循环后的两个字符串上使用 assertEquals 方法。口味问题,我可能更喜欢后者。