JUnit обработка RuntimeException (в частности)
Я склонен бросать столько проверенных Exceptions
вверх, насколько это возможно: он declutters код (и я считаю, проверено Exceptions
как сомнительный аспект Java). Я склонен использовать их при "уточнении" кода.. т.е. когда это имеет смысл для конкретного контекста.
Этот подход немного усложняется при переопределении методов суперкласса / интерфейса, которые не выбрасывают требуемый Exception
и поэтому я склонен делать это:
@Override
public void close() {
try {
_close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
где _close
это частный метод, который делает все дела.
Проблема, когда дело доходит до JUnit, если вы действительно хотите проверить что-то, где выдается исключение _close()
является то, что в результате RuntimeException
кажется, что JUnit обрабатывает "безусловным" образом: кажется, что он всегда останавливает тест с сообщением об ошибке... даже если вы на самом деле поймаете и разберетесь с ним в try .. catch
!
Для этого существует своего рода "обходной путь", который класс CUT закрывает. closeableComponents
когда это закрыто)
@Test (expected = RuntimeException.class)
public void errorFlagShouldBeSetIfAnyCloseablesThrowExceptionWhenCUTCloses() throws Exception {
Closeable spyCloseable = spy( new Closeable(){
@Override
public void close() throws IOException {
throw new IOException( "dummy" );
}});
spyCUT.addCloseableComponent( spyCloseable );
Exception blob = null;
try{
spyCUT.close();
}catch( Exception e ){
blob = e;
}
assertThat( spyCUT.getErrorFlag() ).isTrue();
if( blob != null ){
throw blob;
}
Т.е. если у тебя этого нет expected
установка вы всегда получаете тестовый сбой (из-за RuntimeException
"игнорируя" try .. catch
). Но для того, чтобы удовлетворить expected
Затем вы должны отбросить RuntimeException
в конце теста...
... есть ли способ изменить обработку JUnit RuntimeExceptions
?
1 ответ
Что-то должно быть не так в вашей настройке. JUnit не имеет такой специальной обработки исключений во время выполнения.
Я собрал этот MCVE; и это проходит.
static class CUT {
void close(Closeable _close) {
try {
_close.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Test
public void test() throws Exception {
Closeable spyCloseable = Mockito.spy(new Closeable() {
@Override
public void close() throws IOException {
throw new IOException("dummy");
}
});
Exception blob = null;
try {
new CUT().close(spyCloseable);
fail("should have thrown");
} catch (Exception e) {
blob = e;
}
assertThat(blob.getMessage(), is("java.io.IOException: dummy"));
}
Это не совсем то, что у вас там наверху; но "достаточно близко" в моей голове.
Короче говоря: ваш ответ исходит из другого места. Я предлагаю: сделайте то же самое, что и я: создайте настоящий mcve; и работать свой путь оттуда!