#java #eclipse #junit #junit5
#java #eclipse #junit #junit5
Вопрос:
Я пытаюсь написать JUnit для своего suchAutor()
метода. Проблема в том, что я создаю два разных исключения, и я знаю только, как обрабатывать тесты, которые генерируют одно исключение.
public Buch[] suchAutor(String gesuchterName) throws IllegalArgumentException, FileNotFoundException {
if (gesuchterName == "") {
throw new IllegalArgumentException("Bitte geben sie einen Nachnamen ein.");
}
Buch[] erg = new Buch[0];
int arraylength = 0;
Boolean found = false;
for (int i = 0; i < buecher.length; i ) {
for (int u = 0; u < buecher[i].getAutoren().length; u ) {
if (buecher[i].getAutoren()[u].getNachname() == gesuchterName) {
found = true;
arraylength ;
erg = Arrays.copyOf(erg, arraylength);
erg[arraylength - 1] = buecher[i];
}
}
}
if (found) {
System.out.println(Arrays.toString(erg));
return erg;
} else {
throw new FileNotFoundException("Zu dem gesuchten Autor wurden keine Bücher gefunden.");
}
}
@Test(expected = Exception.class)
public void testSuchAutorGrenzwert() {
try {
bibliothek.suchAutor("");
} catch (IllegalArgumentException e) {
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
}
Комментарии:
1. Прямо сейчас тест завершается неудачно, потому что пустая строка просто выдает исключение IllegalArgumentException.
2. Вы должны написать отдельные модульные тесты для каждого исключения, которое может выдать ваш метод. Метод может выдавать только одно исключение за раз.
3. но когда я это делаю, я получаю сообщение об ошибке для исключения IlegelArgument: Необработанное исключение типа FileNotFoundException
4. Я бы также не стал писать блок try-catch в тесте — просто добавьте соответствующее
throws
предложение в сигнатуру метода
Ответ №1:
Вопрос помечен junit5, и в Jupiter есть специально выделенный объект assertThrows:
@Test
void failsOnEmptyName(){
assertThrows(IllegalArgumentException.class, ()-> bibliothek.suchAutor(""));
}
Комментарии:
1. Полностью пропустил тег JUnit5, я просто посмотрел на тестовый стиль предполагаемого JUnit4. Мой плохой.
2. Даже находясь под корнем Jupiter, многие люди предпочитают придерживаться привычного дизайна junit4. Так что лучше знать об обоих подходах 🙂
Ответ №2:
public class MyTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void myTest() throws IllegalArgumentException, FileNotFoundException {
thrown.expect(IllegalArgumentException.class);
myObject.suchAutor("");
}
@Test
public void myOtherTest() throws IllegalArgumentException, FileNotFoundException {
thrown.expect(FileNotFoundException.class);
myObject.suchAutor("An Unknown Autor");
}
}
В приведенном выше примере мы используем правило, аналогичное тому, что следующий код должен выдавать и exception, если тест не выдает и exception или выдает исключение, отличное от IllegalArgumentException
тогда тест завершится неудачей.
Мы настроили правило так, чтобы по умолчанию оно не ожидало исключения, любой тест, не проверяющий исключения, должен работать правильно.
смотрите Документы JUnitКомментарии:
1. Теперь я попробовал это так: @Test(ожидается = Exception.class ) общедоступные недействительные тесты suchautorgrenzwert() { попробуйте { bibliothek.suchAutor(«»); } поймать (исключение IllegalArgumentException e) { } } @Test(ожидается = Exception.class ) публичные пустые тесты suchautorgrenzwert2() { попробуйте { bibliothek.suchAutor(«»); } catch (FileNotFoundException e) { } } Но нет, он говорит: необработанное исключение типа FileNotFoundException
2. Извините, я не знаю, как отформатировать код комментария: (
3. используйте одинарные обратные кавычки вокруг битов кода. Никаких извинений не требуется, мы все учимся 🙂
4.
@Test(expected = Exception.class) public void testSuchAutorGrenzwert() { try { bibliothek.suchAutor(""); } catch (IllegalArgumentException e) { } } @Test(expected = Exception.class) public void testSuchAutorGrenzwert2() { try { bibliothek.suchAutor(""); } catch (FileNotFoundException e) { } }
5. Ошибка заключается в том, что вы указали Test annotation (
@Test
) ожидатьException
, но на самом деле этоFileNotFoundException
происходит, если вы измените ожидаемоеFileNotFoundException.class
значение, я подозреваю, что ваш тест пройдет
Ответ №3:
Я просто нажал на быстрое исправление, и теперь это работает: D
@Test
public void testSuchAutorGrenzwert() {
try {
bibliothek.suchAutor("");
} catch (IllegalArgumentException | FileNotFoundException e) {
// TODO Auto-generated catch block
e.getMessage();
}
}
Комментарии:
1. Это также работает, если suchAutor() НЕ генерирует исключение.