我正在尝试为Scala和SBT编写的小命令行应用程序编写集成测试。我的应用程序通常会从SBT提示符运行,如下所示:
> run "my arg"
使用args(0)
在应用中访问“my arg”参数。对于集成测试,如何使用参数模拟调用run
并断言控制台输出?
答案 0 :(得分:3)
您的应用需要object
main
方法,并以Array[String]
为参数。
看起来像这样
object Main extends App {
print("hi, " + args(0))
}
或者像这样
object Main {
def main(args: Array[String]) = print("hi, " + args(0))
}
无论如何,如果你能在sbt中做> run "my arg"
,你肯定有这种切入点。
只有一个名为object
的{{1}} main
可以随时随地调用。只需导入并使用:
Main.main(Array("my arg"))
执行时会将文本打印到控制台。我们需要将控制台输出重定向到其他流,以便能够验证它。
使用Redirect stdout in another thread的回答,您可以得到类似的内容:
val baos = new ByteArrayOutputStream
val ps = new PrintStream(baos)
Console.withOut(ps)(Main.main(Array("my arg")))
val output = baos.toString
您可以对output
值
然后,您可以创建一个帮助方法来为您处理
def outputFor(args: String*): String = {
val baos = new ByteArrayOutputStream
val ps = new PrintStream(baos)
Console.withOut(ps)(Main.main(args.toArray))
baos.toString
}
然后轻松测试您的应用
"My app" should "greet me" {
outputFor("harryg") shouldBe "hi, harryg"
}
为了澄清,整个解决方案与sbt
本身无关,我们直接以与sbt相似的方式调用该程序。