Ответ 1
На самом деле в JUnit 4.7 есть альтернатива @Test(expected=Xyz.class)
с использованием Rule
и ExpectedException
В вашем тестовом примере вы объявляете ExpectedException
аннотацией @Rule
и назначаете ему значение по умолчанию ExpectedException.none()
. Затем в тесте, который ожидает исключение, вы заменяете значение фактическим ожидаемым значением. Преимущество этого состоит в том, что без использования уродливого метода try/catch вы можете дополнительно указать, каким было сообщение в исключении
@Rule public ExpectedException thrown= ExpectedException.none();
@Test
public void myTest() {
thrown.expect( Exception.class );
thrown.expectMessage("Init Gold must be >= 0");
rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}
Используя этот метод, вы можете проверить, является ли сообщение в общем исключении чем-то конкретным.
ДОБАВЛЕНИЕ Еще одним преимуществом использования ExpectedException
является то, что вы можете более точно определить исключение в контексте тестового примера. Если в @Test(expected=Xyz.class)
вы используете только @Test(expected=Xyz.class)
, то исключение Xyz может быть выброшено в любом месте кода теста, включая любые настройки теста или предварительные утверждения в методе теста. Это может привести к ложному срабатыванию.
Используя ExpectedException, вы можете отложить указание thrown.expect(Xyz.class)
до тех пор, пока не будет выполнена какая-либо настройка и предварительные утверждения, непосредственно перед фактическим вызовом тестируемого метода. Таким образом, вы более точно определяете, какое исключение выдается фактическим вызовом метода, а не каким-либо из самих тестовых устройств.
JUnit 5 ПРИМЕЧАНИЕ:
JUnit 5 JUnit Jupiter полностью удалил @Test(expected=...)
, @Rule
и ExpectedException
. Они заменены на новый assertThrows()
, который требует использования Java 8 и лямбда-синтаксиса. ExpectedException
по-прежнему доступно для использования в JUnit 5 до JUnit Vintage. Также JUnit Jupiter также продолжит поддерживать исключение JUnit 4 ExpectedException
посредством использования модуля junit-jupiter -igrationsupport, но только если вы добавите дополнительную аннотацию на уровне класса @EnableRuleMigrationSupport
.