如何模拟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解决方案的输入上。