当方法在jUnit中抛出异常时

时间:2012-02-19 15:07:09

标签: java exception java-ee junit

对于在jUnit测试中抛出异常的方法,您如何处理?如您所见,addAnswer类中的Question方法可能会抛出异常。在shouldFailifTwoAnswerAreCorrect方法中,我想检查是否抛出了异常但是在shouldAddAnswersToQuestion

我应该从私有MultipleAnswersAreCorrectException方法中添加thr addAnswerToQuestion并在shouldAddAnswersToQuestion中尝试/ catch还是在该方法中抛出它?

当方法在测试中抛出异常时你会怎么做?

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);    
    }
}

2 个答案:

答案 0 :(得分:7)

您必须向throws添加addAnswerToQuestion声明,然后尝试/捕获异常或使用expected属性或@Test

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

答案 1 :(得分:0)

shouldAddAnswersToQuestion测试中,如果您不期望MultipleAnswersAreCorrectException,则可以在try / catch中包围该块并写入断言失败条件,例如。

    @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失败而失败,而不是因为异常。