猿问

编写处理行尾断言的跨平台单元测试

我正在使用 JUnit 来测试程序的打印输出。我通过设置System.out为我自己的PrintStream打印到ByteArrayOutputStream. 我的测试通常是这样的:

assertEquals("Some line of text\r\n", output);

我对如何让这段代码跨平台工作感兴趣。如果我在 linux 上运行这些测试,所有这些测试都会失败。我可以编写更复杂的测试,它接受\r\n\n在输出中接受,但如果可能的话,我想保持测试简单。有没有办法设置打印的换行符类型println()


一只斗牛犬
浏览 148回答 3
3回答

翻阅古今

您应该保持系统的默认行为,并更改您的断言代码:String EOL = System.getProperty("line.separator")assertEquals("Some line of text" + EOL, output);为什么?EOL (end-of-line, or line-separator) 依赖于系统,如果你改变默认行为,你可能会遇到其他奇怪的错误。在您的情况下,您可以在自己的字符串中更改 EOL 就足够了。其他(可能不好)方法可能包括:替换所有\r\n和\r到\n并使用\n来比较所有输出,不使用PrintStream而是自己构建字符串等。

小唯快跑啊

对于 JUnit 4,系统规则库有助于此类测试。它也支持行尾规范化。测试看起来像public class MyTest {  @Rule  public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();  @Test  public void writesTextToSystemOut() {    System.out.print(String.format("Some line of text%n)");    assertEquals(      "Some line of text\n",      systemOutRule.getLogWithNormalizedLineSeparator()    );  }}完全披露:我是系统规则的作者。
随时随地看视频慕课网APP

相关分类

Java
我要回答