Когда методы выдают исключения в jUnit - PullRequest
0 голосов
/ 19 февраля 2012

Что вы делаете с методами, которые генерируют исключения в тестах jUnit?Как видите, метод addAnswer в классе Question может вызвать исключение.В методе shouldFailifTwoAnswerAreCorrect я хочу проверить, выбрасывается ли исключение, но в shouldAddAnswersToQuestion

Должен ли я добавить throws MultipleAnswersAreCorrectException из частного метода addAnswerToQuestion и попробовать / перехватить в 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);    
    }
}

Ответы [ 2 ]

7 голосов
/ 19 февраля 2012

Вы должны добавить объявление throws к addAnswerToQuestion, а затем либо попытаться / перехватить исключение, либо использовать атрибут expected или @Test:

@Test(expected=IOException.class)
public void test() {
    // test that should throw IOException to succeed.
}
0 голосов
/ 19 февраля 2012

В тесте shouldAddAnswersToQuestion, если вы не ожидаете MultipleAnswersAreCorrectException, вы можете заключить блок в попытку / перехват и написать условие сбоя подтверждения, например,

    @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, а не из-за исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...