Вопрос-ответ

How do you assert that a certain exception is thrown in JUnit tests?

Как вы утверждаете, что в тестах JUnit генерируется определенное исключение?

Как я могу идиоматически использовать JUnit, чтобы проверить, что какой-то код генерирует исключение?

Хотя я, конечно, могу сделать что-то подобное:

@Test
public void testFooThrowsIndexOutOfBoundsException() {

boolean thrown = false;

try {
foo.doStuff();
} catch (IndexOutOfBoundsException e) {
thrown = true;
}

assertTrue(thrown);
}

Я помню, что есть аннотация или Assert.xyz или что-то, что гораздо менее запутанно и гораздо более в духе JUnit для подобных ситуаций.

Переведено автоматически
Ответ 1

Это зависит от версии JUnit и того, какие библиотеки assert вы используете.

Первоначальный ответ для JUnit <= 4.12 был:

    @Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {

ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);

}

Хотя в ответе больше вариантов для JUnit <= 4.12.

Ссылка:

Ответ 2

Редактировать: Теперь, когда выпущены JUnit 5 и JUnit 4.13, лучшим вариантом было бы использовать Assertions.assertThrows() (для JUnit 5) и Assert.assertThrows() (для JUnit 4.13+):

@Test
void exceptionTesting() {
Exception exception = assertThrows(ArithmeticException.class, () ->
calculator.divide(1, 0));
assertEquals("/ by zero", exception.getMessage());
}

See my other answer for details.

If you haven't migrated to JUnit 5, but can use JUnit 4.7, you can use the ExpectedException Rule:

public class FooTest {
@Rule
public final ExpectedException exception = ExpectedException.none();

@Test
public void doStuffThrowsIndexOutOfBoundsException() {
Foo foo = new Foo();

exception.expect(IndexOutOfBoundsException.class);
foo.doStuff();
}
}

Это намного лучше, чем @Test(expected=IndexOutOfBoundsException.class) потому что тест завершится неудачей, если IndexOutOfBoundsException будет запущен раньше foo.doStuff()

Подробнее смотрите Эту статью.

Ответ 3

Будьте осторожны, используя ожидаемое исключение, потому что оно только утверждает, что метод выдал это исключение, а не конкретную строку кода в тесте.

Я обычно использую это для проверки параметров тестирования, потому что такие методы обычно очень просты, но более сложные тесты лучше обслуживать с:

try {
methodThatShouldThrow();
fail( "My method didn't throw when I expected it to" );
} catch (MyException expectedException) {
}

Примените суждение.

Ответ 4

в junit есть четыре способа протестировать исключение.

junit5.x


  • для junit5.x вы можете использовать assertThrows следующим образом


    @Test
    public void testFooThrowsIndexOutOfBoundsException() {
    Throwable exception = assertThrows(IndexOutOfBoundsException.class, () -> foo.doStuff());
    assertEquals("expected messages", exception.getMessage());
    }

junit4.x


  • для junit4.x используйте необязательный 'expected' атрибут Test annonation


    @Test(expected = IndexOutOfBoundsException.class)
    public void testFooThrowsIndexOutOfBoundsException() {
    foo.doStuff();
    }

  • для junit4.x используйте правило ExpectedException


    public class XxxTest {
    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void testFooThrowsIndexOutOfBoundsException() {
    thrown.expect(IndexOutOfBoundsException.class)
    //you can test the exception message like
    thrown.expectMessage("expected messages");
    foo.doStuff();
    }
    }

  • вы также можете использовать классический способ try / catch, широко используемый в junit 3 framework


    @Test
    public void testFooThrowsIndexOutOfBoundsException() {
    try {
    foo.doStuff();
    fail("expected exception was not occured.");
    } catch(IndexOutOfBoundsException e) {
    //if execution reaches here,
    //it indicates this exception was occured.
    //so we need not handle it.
    }
    }

  • итак



    • если вам нравится junit 5, то вам должен понравиться и 1-й

    • второй способ используется, когда вы хотите протестировать только тип исключения

    • первое и последние два используются, когда вы хотите дополнительно протестировать сообщение об исключении

    • если вы используете junit 3, то предпочтительнее использовать 4-й


  • для получения дополнительной информации вы можете прочитать этот документ и руководство пользователя junit5 для деталей.


java exception junit