2011-08-28 12 views
21

printlnステートメントを介して出力を標準出力にテストできるようにするScalatestには何かがありますか?Scalatest - printlnのテスト方法

これまでは、主にFunSuite with ShouldMatchersを使用していました。

どのように我々は

object Hi { 
    def hello() { 
    println("hello world") 
    } 
} 

答えて

24

の印刷出力をチェックしますかコンソールにprint文をテストするための通常の方法は、あなたがそれらのステートメントを傍受できるように、少し異なるプログラムを構築することです。あなたは、例えばOutput形質を導入することができます:printlnのはConsole.setOutを使用してへの書き込み場所を置き換えることができ

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") 
+0

MockOutputに 'override'を追加する必要があります –

+0

私はこの解決策が大好きです。@Ericは' Output'を拡張することなくこれを行う方法があります。私は、その形質が最初に必要でない、形質を「延長する」と感じている、ハックである。この特性が既に必要であり、我々がテストインプラントを作成していればそれは意味をなさないでしょう。 –

+3

形質を広げるのを避ける唯一の方法は、ケヴィンやマティューがアドバイスしていることをすることです。つまり、私はあなたのソフトウェアをテスト可能なように構築するという哲学が、優れた設計上の決定だと考えています。その考えを追求するときには、すべてのIO /外部システムの相互作用のための特性を導入することに至ります。 – Eric

2

trait Output { 
    def print(s: String) = Console.println(s) 
    } 

    class Hi extends Output { 
    def hello() = print("hello world") 
    } 

そして、あなたはMockOutput実際に傍受通話別の形質を定義することができ、あなたのテストで

(PrintStream)

val stream = new java.io.ByteArrayOutputStream() 
Console.setOut(stream) 
println("Hello world") 
Console.err.println(stream.toByteArray) 
Console.err.println(stream.toString) 

任意のタイプのストリームを使用できます。あなたは、あなただけの限られた期間のためのコンソール出力をリダイレクトしたい場合は、

Console.setErr(PrintStream) 
Console.setIn(PrintStream) 
+1

'Console。{setErr、setIn、setOut}'は2.11.0から廃止されました(この回答が提出されてから3年後)。 –

+0

新しいメソッドはConsoleです。{withOut、withIn、withErr} – Zee

57

と標準エラー出力と標準入力のためのものと同じ種類の操作を行うConsoleに定義されたwithOutwithErrメソッドを使用することができます :

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") 
} 
+0

良い点、私はそれを忘れていました。 – Eric

+3

これは良い方法です。テストのためにプログラムを再構成する必要はありません。 – incarnate

関連する問題