У меня есть класс 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
?
Для людей, не использующих '@ slf4j', это вопросы могут быть полезными http://stackoverflow.com/q/24439151/239408 – xverges