使用 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 类似的方式调用程序。
我正在尝试为我使用 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 类似的方式调用程序。