Это намного лучше, чем @Test(expected=IndexOutOfBoundsException.class) потому что тест завершится неудачей, если IndexOutOfBoundsException будет запущен раньше foo.doStuff()
Будьте осторожны, используя ожидаемое исключение, потому что оно только утверждает, что метод выдал это исключение, а не конкретную строку кода в тесте.
Я обычно использую это для проверки параметров тестирования, потому что такие методы обычно очень просты, но более сложные тесты лучше обслуживать с:
try { methodThatShouldThrow(); fail( "My method didn't throw when I expected it to" ); } catch (MyException expectedException) { }
Примените суждение.
Ответ 4
в junit есть четыре способа протестировать исключение.
junit5.x
для junit5.x вы можете использовать assertThrows следующим образом
@Test publicvoidtestFooThrowsIndexOutOfBoundsException() { thrown.expect(IndexOutOfBoundsException.class) //you can test the exception message like thrown.expectMessage("expected messages"); foo.doStuff(); } }
вы также можете использовать классический способ try / catch, широко используемый в junit 3 framework
@Test publicvoidtestFooThrowsIndexOutOfBoundsException() { 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-й