2015-05-21 3 views
4

У меня есть класс Groovy, аннотированный @Slf4j, поэтому он получает приватное поле Logger log, использование которого я бы хотел проверить. Я хочу продолжить использование @Slf4j и не выставлять поле log для дальнейшего тестирования.Mocking slf4j with Spock

Я пишу свои тесты, используя Spock 1.0, и попытался выполнить это, используя интеграцию Spock для издевательств и ступени. Global раскорчевка должна помочь мне перехватить LoggerFactory вызов, чтобы получить фактический Logger экземпляр, так что мое текущее предположение заключается в следующем:

LoggerFactory logFactory = GroovyStub(global: true) 
logFactory.getLogger(_) >> Mock(Logger) 
// create my @Slf4j-annotated object afterwards 

Интересно, что перехват на самом деле работает, println подтверждает, что класс фактически получает объект Mock for type 'Logger' named 'dummy', но второй оператор, который инструктирует заглушку возвращать макет, кажется, не улавливает. Вместо того, чтобы поведение заглушки по умолчанию возвращает еще одну заглушки, которая не может быть использована для насмешливых конечно:

org.spockframework.runtime.InvalidSpecException: Stub 'dummy' matches the following required interaction: 

1 * plugin.log.warn(_) (0 invocations) 

Remove the cardinality (e.g. '1 *'), or turn the stub into a mock. 

Что мне нужно изменить, чтобы позволить погасила LoggerFactory вернуть макет Logger?

+0

Для людей, не использующих '@ slf4j', это вопросы могут быть полезными http://stackoverflow.com/q/24439151/239408 – xverges

ответ

0

Если вы хотите протестировать выход журнала, почему бы вам не позволить фреймворку регистрации выполнить свою работу и проверить результат (файл журнала)? Вам нужно будет только подключить вывод журнала к файлу, к которому вы обращаетесь после запуска теста.

Это может привести к менее хрупким испытаниям.

+0

Как это сделать? Я попытался использовать http://projects.lidalia.org.uk/slf4j-test/, но мой путь к классам уже содержит бэкэнд slf4j, поэтому я не могу его изменить (и не хочу менять его для всех моих тестов). – orsg

+0

Какие рамки вы используете? – loteq