如何在Java中模拟System.in(除了在Junit测试用例中使用)?

时间:2018-02-28 05:08:44

标签: java mocking inputstream

我使用了TextFromStandardInputStream和JUnit Test Case,它运行正常。但是现在我想根据我的要求在Test Cases外面模拟StandardInputStream。我在测试用例之外使用了相同的TextFromStandardInputStream,但它根本不起作用。那么,有没有办法完成这项工作?

  

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

@Rule
public final TextFromStandardInputStream systemInMock = emptyStandardInputStream();

内部测试案例:

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

2 个答案:

答案 0 :(得分:1)

您可以使用System.setIn()将系统设置为模拟,假设您已存根输入流:

System.setIn(systemInMock);

这适用于普通输入流:

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

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

答案 1 :(得分:-1)

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