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; и работать свой путь оттуда!

Другие вопросы по тегам