コード(以下の擬似コードを参照)が正しく例外をキャッチすることを確認するテストを作成しようとしています。私は、JUnitのコードは次のコードで例外がスローされますかどうかをテストすることが可能であることを知っている:しかし、私はこの例外をキャッチをテストしてるのソフトウェアの私の元のコードをJUnitでキャッチされた例外のテスト
@Test (expected = ArrayIndexOutOfBoundsException.class)
をし、メッセージを出力
catch (ArrayIndexOutOfBoundsException E) {
System.out.print("The output should be of even length!");
}
JUnitがこのメッセージを確認する方法はありますか?または私のキャッチフレーズで何かを変えるべきですか?
注:
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void decodeOddLengthInput() {
thrown.expect(ArrayIndexOutOfBoundsException.class);
thrown.expectMessage("Message");
しかし、プログラムがクラッシュし、それがExpectedException
オブジェクトを認識しないので、私は、私は次のように使用する必要があることを読みました。
私がテストしようとしている方法の擬似コードは、(理由は、プライバシー上の理由で、正確なものを投稿しない):
public String decode(byte[] array){
try{
for(int i= 0; i<array.length; i= i+2){
//basically it crashes when input is an array of odd length (because of i=i+2)
get byte at array[i] and turn it into a string;
}
}
catch (ArrayIndexOutOfBoundsException E) { System.out.print("Message!");}
return string ;
}
例外をキャッチしているメソッドは、呼び出し元のメソッドに公開されていないため、そのメソッドをテストすることはできません。例外がスローされたことをテストすることができます(スローされた場合、テストが失敗するシナリオを再現します)。メソッドによって捕捉された例外は、その署名の一部ではなく、特定の単体テストの範囲外の実装の詳細とみなされるべきです。 – nbrooks
この質問は、おそらくあなたがテストしている方法について何か迷っていることを示しています。それが結果を返すことになっているメソッドであれば、例外をキャッチしてメッセージを出力し、すべてが大事になったかのように続行すると、おそらくそれは何をすべきかではありません。とにかく単なるテストをして出力したり、エラーメッセージを出力したりする方法であれば、単体テストは難しいでしょう。後者の場合、メソッドを計算を行うものと結果を出力するものにリファクタリングし、最初のものをユニットテストすることができます。 – ajb
あなたもコードを投稿できますか? – Jobin