【问题标题】:How to mock System.in in Java (except using inside Junit Test Case)?如何在 Java 中模拟 System.in(除了在 Junit 测试用例中使用)?
【发布时间】:2018-02-28 13:49:17
【问题描述】:

我已将 TextFromStandardInputStream 与 JUnit 测试用例一起使用,效果很好。但是现在我想根据我的要求在测试用例之外模拟 StandardInputStream。我在测试用例之外使用了相同的 TextFromStandardInputStream 但它根本不起作用。那么,有什么办法可以完成这项工作吗?

我用过的带有测试用例的 StandardInputStream 示例

@Rule
public final TextFromStandardInputStream systemInMock = emptyStandardInputStream();

内部测试用例:

systemInMock.provideLines("1","2");

【问题讨论】:

  • Java 没有 StandardInputStream 类。你的意思是要模拟System.in?如果是这样,请编辑问题并澄清您的术语。
  • Mocking Java InputStream的可能重复
  • 安德烈亚斯,感谢您的建议。已编辑问题。

标签: java mocking inputstream


【解决方案1】:

您可以使用System.setIn() 将系统设置到您的模拟中,假设您已经对输入流进行了存根:

System.setIn(systemInMock);

这适用于普通输入流:

System.setIn(new ByteArrayInputStream("yes".getBytes()));
System.out.println(System.in.read());// outputs 121

同样,如果在将 System.in 设置为模拟值之前将其存储在变量中,则可以重置它。

【讨论】:

    【解决方案2】:

    您可以使用Aspect Oriented Programming 拦截到System.in 并进行模拟而不是调用真正的System.inAspectJSpring AOP 可能是一个起点。

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多