私はScalaとSBTで書いている小さなコマンドラインアプリケーションの統合テストを書こうとしています。私のアプリは、通常、そのようSBTプロンプトから実行することになります。SBTでScalatestのコマンドライン引数を設定
> run "my arg"
引数「私のargは」args(0)
でアプリにアクセスします。統合テストの場合、引数付きのrun
の呼び出しをシミュレートし、コンソール出力をアサートする方法はありますか?
私はScalaとSBTで書いている小さなコマンドラインアプリケーションの統合テストを書こうとしています。私のアプリは、通常、そのようSBTプロンプトから実行することになります。SBTでScalatestのコマンドライン引数を設定
> run "my arg"
引数「私のargは」args(0)
でアプリにアクセスします。統合テストの場合、引数付きのrun
の呼び出しをシミュレートし、コンソール出力をアサートする方法はありますか?
アプリには、をパラメータとするmain
メソッドを持つobject
メソッドが必要です。 それはあなたがSBTで> run "my arg"
を行うことができればとにかく、あなたは間違いなく、エントリポイントのこの種を持っているこの
object Main extends App {
print("hi, " + args(0))
}
またはこの
object Main {
def main(args: Array[String]) = print("hi, " + args(0))
}
などのように見えます。
main
と呼ばれる方法を使用して、電話をかけることができるのはobject
です。それをインポートして使用します:
Main.main(Array("my arg"))
実行時にコンソールにテキストを出力します。私たちはコンソール出力を確認するためにコンソール出力を他のストリームにリダイレクトする必要があります。
val baos = new ByteArrayOutputStream
val ps = new PrintStream(baos)
Console.withOut(ps)(Main.main(Array("my arg")))
val output = baos.toString
そして、あなたはoutput
値
にテストのすべての並べ替えを行うことができますが、その後のためにこれを処理するためのヘルパーメソッドを作成することができます:あなたはこのような何かを思い付くことができRedirect stdout in another threadからの回答を使用して
あなた
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と同様の方法でプログラムを呼び出します。
ここで答えを見つけることができます:http://stackoverflow.com/questions/16380699/redirect-stdout-in-another-thread –
ありがとうございますが、私はそれを理解できません - どうすれば 'main()'引数を渡している間に? – harryg