将数据写入System.in

Mes*_*sut 12 java io junit system.in

在我们的应用程序中,我们期望用户输入Thread如下:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Run Code Online (Sandbox Code Playgroud)

我想在我的单元测试中传递该部分,以便我可以恢复该线程来执行其余的代码.我如何System.in从junit 写出一些内容?

jjn*_*guy 26

你想要做的是使用setIn()来自的方法System.这将允许您System.in从junit 传递数据.


Aar*_*lla 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 );
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 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"));
Run Code Online (Sandbox Code Playgroud)