2016-12-28 11 views
2

Stringをstdoutに書き込むvoid型メソッドをテストしたいと考えています。 私のチームと私は、このメソッドを呼び出すときに期待されるString/textとその出力を比較しようとしています。JUnit Testing - void型メソッドのstdout出力と文字列の比較

注:私はJavaとStackOverflowの両方の初心者です。この方が良い方法があれば、それについて通知されることに感謝します。

public static boolean test_printAdequateOption(String txt, double[] 
sol, Formatter out, String expectedOutput) { 
     //Obj. 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PrintStream ps = new PrintStream(baos); 
     PrintStream sout = System.out; 

     System.setOut(ps); 

     printAdequateOption(txt, sol, out); 

     System.out.flush(); 
     System.setOut(sout); 



    return baos.toString().equals(expectedOutput); 
} 

このテストの背後にある思想は、それは私が文字列として保存し、したがって、パラメータouputを期待し、それを比較することができますようにのPrintStreamのメソッドprintAdequateOptionの出力を印刷することです。

+0

これはあなたの質問に対する適切な答えのようです:http://stackoverflow.com/questions/32241057/how-to-test-a-print-method-in-java-using-junit –

+0

ニース。質問ありますか? –

+0

はい、void型のメソッドと文字列を比較する方法を理解したい – user7350907

答えて

0

まず:

  1. ネーミング:あなたが唯一のSOME_CONSTANT内_文字を使用します。あなたのメソッドを呼び出す方が良いでしょう。testPrintAdequateOption()
  2. テスト自体をJUnit @Testにする。その後;ブール値を返す代わりに。テストコードの中に実際にアサートを作ります。その結果、実際にはというテストは予期せぬ結果でに失敗します(その方法については下記を参照してください)。
  3. このようにしておきたい場合は、少し誤解を招く場合があります。むしろメソッドdoesPrintAdequateOptionGiveCorrectResultsOn()またはそのようなものを呼び出すことになります。ブール値を返すメソッドは、その名前に、それらが真正であることを示す必要があります。

純粋な技術的ポイントから、上記のコードはOKです。それ以外の場合デザイン問題... stdoutに書き込まれたテストコンテンツがコードをテストする "唯一の"方法である場合、あなたは実際のテストを調べる必要があります。

他の言葉で言えば、あなたのテストはあなたができることです。あなたがテストしようとしていること。それぞれあなたがこれをこのようにしなければならないという事実は...本当の問題です!

編集:JUnitの単体テストを本当に求めていたことを何とか見落としました。このように、より良い答えを与えることができますし、単にリアル JUnitテストはここのようになります方法を示しています。

@Test 
public boolean testPrintAdequateOption() { 
    // overwrite stdout to allow for capturing print statement 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    PrintStream ps = new PrintStream(baos); 
    PrintStream sout = System.out; 
    System.setOut(ps); 

    // call method with specific input 
    String text = ... 
    double[] sol = ... 
    Formatter formatter = ... 
    printAdequateOption(text, sol, formatter); 

    System.out.flush(); 
    System.setOut(sout); 

    assertThat(baos.toString(), is("expected output)); 
    } 

合理的なテストは、ように見えるだろうか。つまり、 JUnitを使用して実行されます。例えばあなたのEclipse IDE内で。

ご注意:私は assertThatアサートを使用しています、 hamcrestマッチャーで一緒に。これらの2つについては、hereを参照してください。

あなたがそのようなテストを書くとき、あなたは単にあなたのロジックを変更すべきであることが本当に明白になります。非常にtomkabが彼の答えで示唆しているように - あなたはprintAdequateOption()が文字列を生成し、単にそれをSystem.outに出力することを望まない。代わりに、その文字列を生成するメソッドが必要です。これを直接行うことができます。だからあなたのコードでやっているような迂回はありません!

+0

こんにちはGhostCat、 – user7350907

+0

こんにちはGhostCat、 回答ありがとうございます。これらのテストは大学のプロジェクトのためのもので、JUnitを使用するように言われていませんでした。私たちは情報をリストするのに使用されるメソッドをテストする際に問題を抱えていますが、あなたが個人的な観点から言ったように、それらのメソッドでは実際のテストはできません。私たちのチームは何をすべきかアドバイスできますか? – user7350907

+0

なぜ手動でエラーメッセージを作成するのですか?あなたは単にassertionを使うべきです: 'assert("出力メッセージ "、baos.toString()、expectedOutput);' –

3

あなたのコードをリファクタリングして、よりテスト可能にすることをお勧めします。明らかにprintAdequateOption(...)メソッドは文字列をフォーマット/作成し、System.out.println()(または私が想定しているようなもの)を呼び出します。

標準出力に出力するためのJDK呼び出しが正しく入力されているかどうかテストするのは気にしませんが、印刷される文字列が期待される形式であることを確認することに興味があります。したがって、本質的に、文字列の作成/書式を、書式設定された文字列を返す別のメソッドに抽出する必要があります。このような方法のテストは簡単であるはずです。

+0

素敵な答え初心者...私はちょっとJUnitの部分を見落としました。実際に彼のデザインをどのように修正するべきかを強調していませんでした。それを変更しました。優れた入力には+1を得ました;-) – GhostCat