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

Set a command line argument for Scalatest with SBT

我正在尝试为我使用 Scala 和 SBT 编写的小型命令行应用程序编写集成测试。我的应用程序通常会像这样从 SBT 提示中 运行:

> run "my arg"

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

您的应用需要有一个 object with 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,带有一个名为 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 类似的方式调用程序。