Функция обжига при неудачном утверждении
Я работаю над сложной генерацией кода с использованием 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());
}
}
Ваш тест должен использовать это правило и записать сгенерированный код в логгер.