【发布时间】:2015-04-06 15:36:54
【问题描述】:
我想为我的 main 函数编写一个单元测试,其中有一个 readLine() 循环。
我已经尝试过以下基于 java 的。我认为readLine() 可能需要System.in 作为inputStream。但它不起作用。 ScalaTest 在 readLine() 等待输入时被阻止。
"readLine" should "work" in {
val in = new ByteArrayInputStream("abc".getBytes)
System.setIn(in)
readLine() === "tester"
}
有什么想法吗?谢谢。
【问题讨论】:
-
我不太清楚你的问题。您是否正在寻找一种更好的阅读台词的方法? io.Source.fromInputStream(...).getLines 可以从输入流中读取,非常容易使用或传递不同的流。
-
readLine是什么 - 这是 scala.Console 或 scala.io.StdIn 中已弃用的方法吗?或者这是你自己创造的功能?如果有,能否发一下出处? -
@soong, @rock-fall 抱歉,问题不清楚。我想要做的是集成测试并模拟用户输入以验证我的应用程序的行为是否正确。由于有一些电话,如
console.readLine()等,我想模拟它们,例如在Inputbuffer中预先添加一些字符串作为用户输入。然后,readLine() 只是从这个InputBuffer读取输入。 -
简而言之,在上面的sn-p代码中,
readLine()应该返回“abc”。 -
我理解那部分,但我认为您遇到的问题是 readLine 的工作方式。如果它设置为使用
System.in在你调用setIn,那么它已经有对原始输入流的引用。如果您使用的是scala.Console,则有一些方法可以在该类中设置新的输入流,这应该可以解决您的问题。 (遗憾的是,scala.io.StdIn依赖于scala.Console,但没有指定输入流的固有方法,尽管子类可以这样做)。
标签: scala mocking inputstream