使用SBT为Scalatest设置命令行参数

时间:2016-03-27 12:09:47

标签: scala sbt scalatest

我正在尝试为Scala和SBT编写的小命令行应用程序编写集成测试。我的应用程序通常会从SBT提示符运行,如下所示:

> run "my arg"

使用args(0)在应用中访问“my arg”参数。对于集成测试,如何使用参数模拟调用run并断言控制台输出?

1 个答案:

答案 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相似的方式调用该程序。