如何模拟scala readLine

如何模拟scala readLine,scala,mocking,inputstream,Scala,Mocking,Inputstream,我想为我的主函数编写一个单元测试,其中有一个readLine()循环 我尝试了以下基于java的方法。我认为readLine()可能需要System.in作为inputStream。但它不起作用。ScalaTest在readLine()上被阻塞,等待输入 "readLine" should "work" in { val in = new ByteArrayInputStream("abc".getBytes) System.setIn(in) readLine() === "tes

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

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

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

有什么想法吗?谢谢。

单元测试的正确方法是遵循模式

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

此外,您还应该进行集成测试,以验证您的“适配器”是否能够在真正的控制台上工作

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

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

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

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

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

我不太清楚你的问题。你在寻找更好的阅读方式吗?io.Source.fromInputStream(…)。getLines可以从输入流中读取数据,并且非常易于使用或传递不同的数据流。什么是
readLine
-这是scala.Console或scala.io.StdIn中不推荐使用的方法吗?或者这是你自己造成的?如果是这样的话,你能公布消息来源吗?@Song,@rock fall很抱歉这个问题不清楚。我想做的是集成测试和模拟用户输入,以验证我的应用程序的行为是否正确。由于有一些调用,如
console.readLine()
等,因此我想模拟它们,例如在
Inputbuffer
中预加一些字符串作为用户输入。然后,readLine()只从这个
InputBuffer
读取输入。简言之,在上面的代码段中,
readLine()
应该返回“abc”。我理解这一部分,但我认为您遇到的问题是readLine如何工作。如果在调用
setIn
之前将其设置为使用
System.in
,则它将已经具有对原始输入流的引用。如果您使用的是
scala.Console
,那么有一些方法可以在该类中设置新的输入流,从而解决您的问题。(遗憾的是,
scala.io.StdIn
依赖于
scala.Console
,但没有指定输入流的固有方法,尽管子类可以做到这一点)。非常方便。我的sbt测试循环最终被卡在请求Maxim解决方案的输入上。