我想为我的main函数编写一个单元测试,其中有一个readLine()
循环。
我尝试了以下基于java的。我认为readLine()
可能需要System.in
作为inputStream
。但它不起作用。 ScalaTest在readLine()
等待输入时被阻止。
"readLine" should "work" in {
val in = new ByteArrayInputStream("abc".getBytes)
System.setIn(in)
readLine() === "tester"
}
有什么想法吗?谢谢。
答案 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")
}