Как сказать JUnit игнорировать вложенные исключения?

1

Если у меня есть 2 класса как таковые:

public class A {

    public A(boolean bool){
        if(bool){
            // currently broken
            // would throw RuntimeException
        }
        B.doSomething();
    }
}

а также

public class B {

    public static void doSomething() throws RuntimeException{
        throw new RuntimeException();
    }
}

и мой unit тест для класса A будет выглядеть следующим образом:

public class ATest {
    @Test (expected=RuntimeException)
    public void testA(){
        new A(true);
    }
}

Как бы то ни было, тест будет успешным из-за того, что метод класса B также выбрасывает RuntimeException и тот факт, что A сломан, не будет сразу виден.

Можно ли сказать JUnit каким-то образом игнорировать исключения, исходящие из B без использования насмешливых фреймворков?

  • 1
    краткий ответ: нет. Пояснение: Только А должен быть тестируемой единицей. B является зависимостью
  • 0
    Мое предположение: использование блока try catch в вашем тесте может помочь вам, но это как бы разрушает тест (imho).
Показать ещё 1 комментарий
Теги:
unit-testing
exception
junit4

3 ответа

1

Нет - результатом вызова метода является RuntimeException и то, что вы тестируете. Как JUnit собирался рассказать о различии между RuntimeException от точного метода, который вы вызываете, и от зависимого вызова? Одним из правил тестирования является то, что вы не должны заботиться о деталях получения результата, просто чтобы он был получен. (Например, вы можете переместить код внутри блока в конструкторе A в отдельный метод, и это не должно нарушать тест.)

На данный момент вы должны иметь возможность легко пройти тест с ошибкой, просто проверяя, что вызов new A(false) не генерирует исключение. В настоящее время этот тест завершится неудачно, потому что вы все еще вызываете B.doSomething(), который все равно будет бросать.

Обратите внимание, что большинство издевательских фреймворков также не помогут в этом, так как вы используете статический метод - вы должны, по крайней мере, подумать о том, чтобы сделать B зависимой от инъекции (возможно, с интерфейсом), поэтому разрешите больше контролировать.

0

Если у вас нет определенного RuntimeException для catch (подкласс RuntimeException), то единственный способ, который я вижу, - поставить try catch в ваш метод testA и в catch, проверить, не содержит ли исключение исключение вложенности, исключение или вызов Assert.fail()

0

В любом случае вы должны избегать "сырых" классов исключений, поэтому правильным способом решения этого было бы создать подкласс RuntimeException который отражает то, что на самом деле пошло не так.

Таким образом, вы можете ссылаться на правильный подкласс RuntimeException в вашем тестовом примере, и вы должны быть в порядке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню