Перехват нескольких исключений с помощью метода Unit

#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:

Предполагая Junit4:

 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() НЕ генерирует исключение.