【发布时间】:2015-08-03 00:42:36
【问题描述】:
我有一个用@Slf4j 注释的 Groovy 类,所以它有一个私有的 final Logger log 字段,我想测试它的用法。我想继续使用@Slf4j,而不是为了启用测试而进一步公开log 字段。
我正在使用 Spock 1.0 编写测试,并尝试使用 Spock 的集成模拟和存根功能来完成此操作。全局存根应该可以帮助我拦截 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的人,这个问题可能有用stackoverflow.com/q/24439151/239408
标签: groovy mocking slf4j spock