如何模拟sc​​ala readLine

Hao*_*Ren 5 scala inputstream mocking

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

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

"readLine" should "work" in {
  val in = new ByteArrayInputStream("abc".getBytes)
  System.setIn(in)
  readLine() === "tester"
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

Tom*_*ous 5

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

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

Console.withIn(in)  {
    assert(StdIn.readLine() === "abc")
}
Run Code Online (Sandbox Code Playgroud)


Max*_*xim 4

单元测试的正确方法是遵循“端口和适配器”模式。

因此,您应该有一个作为控制台读取器的“端口”的接口,以便您可以在单元测试中模拟它。

此外,您应该进行集成测试,以验证您的“适配器”是否确实适用于真正的控制台。

根据你的问题的标题,我猜你想做一个集成测试。你就快到了。您调用了自 Scala 2.11.0 以来已弃用的已弃用方法。这段代码应该可以工作 -

"readLine" should "work" in {
  val in = new ByteArrayInputStream("abc".getBytes)
  System.setIn(in)
  StdIn.readLine() === "abc"
}
Run Code Online (Sandbox Code Playgroud)