2012-02-19 13 views
0

jUnitテストで例外をスローするメソッドではどうしますか?表示されるように、QuestionクラスのaddAnswerメソッドは例外をスローする可能性があります。 shouldFailifTwoAnswerAreCorrect方法では、私は、例外がスローされるかどうかを確認したいが、shouldAddAnswersToQuestionメソッドがjUnitで例外をスローする場合

に私もその方法では民間addAnswerToQuestion方法からMultipleAnswersAreCorrectExceptionをスロー追加のtry/catchをshouldAddAnswersToQuestionまたはそれを投げるべきでしょうか?

メソッドがテストで例外をスローするときはどうしますか?

public class QuestionTest { 

    private Question question; 

    @Before 
    public void setUp() throws Exception { 
     question = new Question("How many wheels are there on a car?", "car.png"); 
    } 

    @Test 
    public void shouldAddAnswersToQuestion() { 

     addAnswerToQuestion(new Answer("It is 3", false)); 
     addAnswerToQuestion(new Answer("It is 4", true)); 
     addAnswerToQuestion(new Answer("It is 5", false)); 
     addAnswerToQuestion(new Answer("It is 6", false)); 

     assertEquals(4, question.getAnswers().size()); 
    } 

    @Test(expected = MultipleAnswersAreCorrectException.class) 
    public void shouldFailIfTwoAnswersAreCorrect() { 

     addAnswerToQuestion(new Answer("It is 3", false)); 
     addAnswerToQuestion(new Answer("It is 4", true)); 
     addAnswerToQuestion(new Answer("It is 5", true)); 
     addAnswerToQuestion(new Answer("It is 6", false)); 
    } 

    private void addAnswerToQuestion(Answer answer) { 
     question.addAnswer(answer); 
    } 
} 

質問クラスのメソッド

public void addAnswer(Answer answer) throws MultipleAnswersAreCorrectException { 

    boolean correctAnswerAdded = false; 

    for (Answer element : answers) { 
     if (element.getCorrect()) { 
      correctAnswerAdded = true; 
     } 
    } 

    if (correctAnswerAdded) { 
     throw new MultipleAnswersAreCorrectException(); 
    } else { 
     answers.add(answer);  
    } 
} 
+0

[JUnit 4のテストで特定の例外がスローされることをどのように主張するのですか?](http://stackoverflow.com/questions/156503/how-do-you-assert-that-a-certain- junit-4テストの例外) – Nateowami

答えて

7

あなたは例外をキャッチ/試すかexpected属性または@Test使用するか、その後addAnswerToQuestionthrows宣言を追加する必要がありますと:shouldAddAnswersToQuestion

@Test(expected=IOException.class) 
public void test() { 
    // test that should throw IOException to succeed. 
} 
+0

jUnitテストのtry/catchで普通以外のことはしないのですか?奇妙な理由で例外がスローされた場合(この方法では使用しないでください)、どうしますか? .printStackTrace()などを書いていますか? – LuckyLuke

+0

正確に。スタックトレースを取得してデバッグを開始してください。 –

+0

@hisあなたが何を意味しているか少し迷っています。私は捕まえて何もしてはいけない、スタックトレースを印刷するべきであるということを意味しますか? – LuckyLuke

0

をあなたが期待していない場合は、MultipleAnswersAreCorrectExceptionをテストし、ブロックを囲むことができますkをトライ/キャッチし、アサート失敗条件を書き込む。

@Test 
public void shouldAddAnswersToQuestion() { 
    try{ 
     addAnswerToQuestion(new Answer("It is 3", false)); 
     addAnswerToQuestion(new Answer("It is 4", true)); 
     addAnswerToQuestion(new Answer("It is 5", false)); 
     addAnswerToQuestion(new Answer("It is 6", false)); 
     assertEquals(4, question.getAnswers().size()); 
    }catch(MultipleAnswersAreCorrectException e){ 
    Assert.assertFail("Some self explainable failure statement"); 
    } 
} 

私は、すべてのテストは、例外のためassertinの故障のために失敗してはならないので、その常により良いテストを行うためには、代わりにテストからの例外をスローする、失敗だと思います。

+1

絶対にありません!このようにして、テストが失敗した理由のすべての情報が完全に失われます。それ以外の場合は、スタックトレースを調べることができます。テストフレームワークは、例外をスローするメソッドを処理する方法を知っています。 –

+0

@hisこの例外はユーザが定義した例外なので、デバッグすることはありません。この例外が発生するタイミングを知っておく必要があります。したがって、スタックトレースを印刷する必要はありません。テストに合格または不合格の2つの出力のみが必要です。 –

+0

スタックトレースを印刷しないでください。予期しない例外*は*失敗です。 –

関連する問題