2013-02-13 4 views
0

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

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

Моя проблема заключается в том, что я не хочу регистрировать сгенерированный код при каждом запуске теста. Но я хочу увидеть сгенерированный код, если тест завершился неудачно. Есть много тестов, и поскольку я использую 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()); 
    } 
} 

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

+0

Perfect. Работал как шарм. Спасибо. – user937720