Подтвердить что ты не робот

JUnit такое же исключение в разных случаях

Я пишу тест jUnit для конструктора, который анализирует строку, а затем проверяет множество вещей. Когда есть неправильные данные, для каждой вещи бросается некоторое IllegalArgumentException с другим сообщением. Поэтому я хотел бы написать тесты для него, но как я могу узнать, какая ошибка была выбрана? Вот как я могу это сделать:

@Test(expected=IllegalArgumentException.class)
public void testRodneCisloRok(){
    new RodneCislo("891415",dopocitej("891415"));
}

и именно так я хотел бы быть, но я не знаю, можно ли это как-то написать:

@Test(expected=IllegalArgumentException.class("error1"))
public void testRodneCisloRok(){
    new RodneCislo("891415",dopocitej("891415"));
}
4b9b3361

Ответ 1

Вам нужно будет сделать это старомодно:

@Test
public void testRodneCisloRok() {
    try {
       new RodneCislo("891415",dopocitej("891415"));
       fail("expected an exception");
    } catch (IllegalArgumentException ex) {
       assertEquals("error1", ex.getMessage());
    }
}

Синтаксис @Test(expected=...) удобен, но во многих случаях он слишком прост.

Если важно различать условия исключения, вы можете рассмотреть возможность создания иерархии классов исключений, которые могут быть пойманы специально. В этом случае подкласс IllegalArgumentException может быть хорошей идеей. Это, возможно, лучший дизайн, и ваш тест может поймать этот особый тип исключения.

Ответ 2

Если у вас JUnit 4.7 или выше, вы можете использовать этот (элегантный) способ:

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void testRodneCisloRok(){
    exception.expect(IllegalArgumentException.class);
    exception.expectMessage("error1");
    new RodneCislo("891415",dopocitej("891415"));
}