为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只斗牛犬 2021-10-20 10:54:42
我正在使用 JUnit 来测试程序的打印输出。我通过设置System.out为我自己的PrintStream打印到ByteArrayOutputStream. 我的测试通常是这样的:assertEquals("Some line of text\r\n", output);我对如何让这段代码跨平台工作感兴趣。如果我在 linux 上运行这些测试,所有这些测试都会失败。我可以编写更复杂的测试,它接受\r\n或\n在输出中接受,但如果可能的话,我想保持测试简单。有没有办法设置打印的换行符类型println()?
查看完整描述

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您应该保持系统的默认行为,并更改您的断言代码:


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而是自己构建字符串等。


查看完整回答
反对 回复 2021-10-20
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

对于 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()

    );

  }

}

完全披露:我是系统规则的作者。


查看完整回答
反对 回复 2021-10-20
  • 3 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信