首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据写入System.in

将数据写入System.in
EN

Stack Overflow用户
提问于 2010-09-28 22:55:39
回答 4查看 19.8K关注 0票数 13

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

代码语言:javascript
复制
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

我想在单元测试中通过这一部分,这样我就可以恢复线程来执行其余的代码。如何将junit中的内容写入System.in

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-28 22:58:23

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

票数 29
EN

Stack Overflow用户

发布于 2010-09-28 22:59:32

在测试期间替换它:

代码语言:javascript
复制
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 );
}
票数 11
EN

Stack Overflow用户

发布于 2010-09-28 23:04:17

代替上面的建议(编辑:我注意到Bart在注释中也留下了这个想法),我建议通过让类接受输入源作为构造函数参数或类似参数(注入依赖项)来使类更易于单元测试。无论如何,一个类不应该如此耦合到System.in。

如果你的类是从Reader构造的,你可以这样做:

代码语言:javascript
复制
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"));
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3814055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档