在我们的应用程序中,我们希望用户输入Thread
如下:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
我想在单元测试中传递该部分,以便我可以恢复该线程来执行其余的代码。如何从junit写入System.in
?
答案 0 :(得分:26)
答案 1 :(得分:9)
在测试期间更换它:
String data = "the text you want to send";
InputStream testInput = new ByteArrayInputStream( data.getBytes("UTF-8") );
InputStream old = System.in;
try {
System.setIn( testInput );
...
} finally {
System.setIn( old );
}
答案 2 :(得分:5)
而不是上面的建议(编辑:我注意到Bart也在评论中留下了这个想法),我建议通过让类接受输入源来使你的类更可单元测试构造函数参数或类似参数(注入依赖项)。无论如何,类不应该与System.in耦合。
如果您的课程是使用Reader构建的,那么您可以这样做:
class SomeUnit {
private final BufferedReader br;
public SomeUnit(Reader r) {
br = new BufferedReader(r);
}
//...
}
//in your real code:
SomeUnit unit = new SomeUnit(new InputStreamReader(System.in));
//in your JUnit test (e.g.):
SomeUnit unit = new SomeUnit(new StringReader("here's the input\nline 2"));