Есть ли способ вынудить JUnit перестать работать на ЛЮБОМ исключении непроверенном, даже если глотавший

Я использую JUnit для записи некоторых высокоуровневых тестов для унаследованного кода, который не имеет модульных тестов.

Большая часть этого кода "глотает" множество исключений непроверенных как NullPointerExceptions (например, просто печатая отслеживание стека и возвращая пустой указатель). Поэтому модульный тест может передать даже через существует каскад аварий в различных точках в более низком коде уровня.

Там какой-либо путь состоит в том, чтобы иметь тестовый сбой на первом исключении непроверенном, даже если их глотают?

Единственная альтернатива, о которой я могу думать, должна записать пользовательскую обертку JUnit, которая перенаправляет System.err и затем анализирует вывод для исключений.

6
задан Uri 6 May 2010 в 17:13
поделиться

6 ответов

Если вы выполняете тесты в отладчике IDE, вы можете настроить IDE для прерывания работы при возникновении исключения.

4
ответ дан 10 December 2019 в 00:35
поделиться

Я бы попробовал использовать AOP для отбрасывания отказов. Что-то вроде этого должно работать (обратите внимание, я не тестировал это, и вам, очевидно, нужно иметь AspectJ Setup, чтобы использовать аннотации AOP)

public class ClassUnderTest
{
   private static Boolean exceptionThrown;


   @Before
   public void resetExceptionFlag()
   {
      ClassUnderTest.exceptionThrown = false;
   }

   @Test
   public void myTestMethod()
   {

      //....
      // My Test Exception Code
      //....

      assertFalse(ClassUnderTest.exceptionThrown);
   }

   @Aspect
   static class TestAspects
   {
      @Pointcut("handler(Exception)")
      public void intereceptAllExceptions(){}

      //This is Fully Qualified because of the conflict with the junit Before annotation above
      @org.aspectj.lang.annotation.Before("intereceptAllExceptions()")
      public void flagExceptionThrown()
      {
         ClassUnderTest.exceptionThrown = true;

  }

} }

1
ответ дан 10 December 2019 в 00:35
поделиться

Возможно, вы можете вставить код, который вы пытаетесь протестировать. Скорее всего, вам придется использовать какой-нибудь фреймворк для тестирования "remapper", например powermock или jmockit для манипуляций с загрузчиком классов в JVM. Но пример тестируемого класса поможет определить необходимый подход.

0
ответ дан 10 December 2019 в 00:35
поделиться

Из-за отсутствия конкретного решения мой ответ довольно общий:

Такие запахи кода (например, зависание исключений) лучше всего устранять шаг за шагом (класс за классом), когда вы сталкиваетесь с ними при исправлении ошибок в устаревшей системе. Инструменты качества кода (например, Findbugs, PMD, Checkstyle или даже Sonar Quality Server) помогут вам найти эти вещи.

Одним из способов автоматического "отлова" проглоченных исключений является использование компилятора AspectJ. Вы можете объявить аспекты для генерации ошибки времени компиляции в вашей среде IDE, когда нарушаются определенные соглашения о коде. В качестве альтернативы вы можете переплетать во время выполнения тестируемые классы и позволить AspectJ повторно генерировать такие исключения, чтобы они могли быть записаны бегуном JUnit.

4
ответ дан 10 December 2019 в 00:35
поделиться

Можно было бы поиздеваться над исключениями, которые вы хотите перехватить, с помощью фреймворка для издевательств, который изменяет байткод, или с помощью фреймворка AOP. Я представляю, что можно модифицировать конструктор, чтобы он выбрасывал более фатальное Исключение, или установить какой-нибудь флаг в тестовом коде.

0
ответ дан 10 December 2019 в 00:35
поделиться

Я полагаю, что Exception - это просто стандартный класс в библиотеках SDK.

Если вы извлекли его, модифицировали и поместили куда-нибудь в classpath перед SDK, я думаю, он должен заменить тот, что в SDK (если нет, вы можете поместить ваше "новое" исключение обратно в SDK jar)

В любом случае, ваше новое исключение может установить статическое значение, которое может быть прочитано фреймворком тестирования.

Возможно, это не самое элегантное решение, но оно не требует никакой "магии"

1
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: