Функция обжига при неудачном утверждении

Я работаю над сложной генерацией кода с использованием CodeModel, доступной на Java. Мне удалось настроить мои модульные тесты таким образом, чтобы тест генерировал небольшой, но функционально полный Java-код, который компилируется в памяти, а сгенерированный класс (классы) загружается / загружается из памяти. В общем, все достаточно быстро, если я не выводю сгенерированный код.

Поскольку код генератора не знает о сгенерированных классах, я использую рефлексию для запуска методов сгенерированного класса, который работает хорошо. Эти методы также могут потерпеть неудачу, так как я использую отражение, чтобы убедиться, что методы ожидали работы, проверив состояние объекта.

Моя проблема в том, что я не хочу регистрировать сгенерированный код каждый раз при запуске теста. Но я хочу увидеть сгенерированный код, если тест не пройден. Существует множество тестов, и так как я использую infintest, мое затмение становится медленнее, поскольку бесконечное количество продолжает накапливать результаты различных тестов.

Могу ли я настроить junit так, чтобы он вызывал мою функцию, если тест не пройден? например

boolean compileSuccessful = compile();
Assert.assertTrue("Ooops, you generated bad code", compileSuccessful);

Если приведенное выше утверждение не удается, я хочу вывести сгенерированный код и посмотреть, что пошло не так.

1 ответ

Решение

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

public class GeneratedCodeLogger extends TestWatcher {
  private Logger log;

  public GeneratedCodeLogger(Logger log) {
    this.log = log;
  }

  @Override
  protected void failed(Description d) {
    System.out.println(log.toString());
  }
}

Ваш тест должен использовать это правило и записать сгенерированный код в логгер.

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