Scalatestには、println
ステートメントを介して標準出力への出力をテストできるものはありますか?
これまで私は主にFunSuite with ShouldMatchers
を使用してきました。
例えばの印刷出力を確認するにはどうすればよいですか
object Hi {
def hello() {
println("hello world")
}
}
コンソールでprintステートメントをテストする通常の方法は、プログラムを少し異なる構造にして、それらのステートメントをインターセプトできるようにすることです。たとえば、Output
トレイトを導入できます。
trait Output {
def print(s: String) = Console.println(s)
}
class Hi extends Output {
def hello() = print("hello world")
}
また、テストでは、実際に呼び出しを傍受する別の特性MockOutput
を定義できます。
trait MockOutput extends Output {
var messages: Seq[String] = Seq()
override def print(s: String) = messages = messages :+ s
}
val hi = new Hi with MockOutput
hi.hello()
hi.messages should contain("hello world")
限られた期間だけコンソール出力をリダイレクトする場合は、withOut
で定義されているwithErr
メソッドとConsole
メソッドを使用します。
val stream = new Java.io.ByteArrayOutputStream()
Console.withOut(stream) {
//all printlns in this block will be redirected
println("Fly me to the moon, let me play among the stars")
}
Console.setOut(PrintStream)を使用して、printlnが書き込む場所を置き換えることができます。
val stream = new Java.io.ByteArrayOutputStream()
Console.setOut(stream)
println("Hello world")
Console.err.println(stream.toByteArray)
Console.err.println(stream.toString)
もちろん、任意のタイプのストリームを使用できます。 stderrとstdinについても同じようなことができます。
Console.setErr(PrintStream)
Console.setIn(PrintStream)