如何模拟sc​​ala readLine

时间:2015-04-06 15:36:55

标签: scala mocking inputstream

我想为我的main函数编写一个单元测试,其中有一个readLine()循环。

我尝试了以下基于java的。我认为readLine()可能需要System.in作为inputStream。但它不起作用。 ScalaTest在readLine()等待输入时被阻止。

"readLine" should "work" in {
  val in = new ByteArrayInputStream("abc".getBytes)
  System.setIn(in)
  readLine() === "tester"
}

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:4)

单元测试的正确方法是遵循"ports and adapters"模式。

所以你应该有一个接口,它是控制台读卡器的'端口',所以你可以在单元测试中模拟它。

此外,你应该有一个集成测试来验证你的'适配器'是否真的可以对付真正的控制台。

根据你问题的标题,我想你想做一个集成测试。你快到了。您调用了自Scala 2.11.0以来不推荐使用的弃用方法。这段代码应该有效 -

"readLine" should "work" in {
  val in = new ByteArrayInputStream("abc".getBytes)
  System.setIn(in)
  StdIn.readLine() === "abc"
}

答案 1 :(得分:3)

Maxim的解决方案实际上对我不起作用(不再?)。所以,为了帮助那些面临同样问题的人:

val in = new ByteArrayInputStream(("abc").getBytes)

Console.withIn(in)  {
    assert(StdIn.readLine() === "abc")
}