当前位置: 首页 > 知识库问答 >
问题:

用Spock模拟slf4j

欧阳飞章
2023-03-14

我有一个用@slf4j注释的Groovy类,因此它得到一个私有的最终Logger log字段,我想测试它的用法。我想继续使用@slf4j,而不是为了启用测试而进一步公开log字段。

我正在使用Spock1.0编写测试,并尝试使用Spock的集成、模拟和截尾功能来完成测试。全局截尾可以帮助我截取LoggerFactory调用以获得实际的Logger实例,因此我目前的猜测是:

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

有趣的是,拦截实际上起作用了,println确认类实际上获得了名为“dummy”的类型“logger”的对象模拟,但是指示存根返回模拟的第二条语句似乎没有捕获。相反,默认存根行为返回另一个存根,当然不能用于嘲弄:

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.

要让Stubed的LoggerFactory返回模拟Logger我需要更改什么?


共有1个答案

朱皓
2023-03-14

您需要使用reflection设置私有的最终日志字段,如下所述:使用StaticLoggerBinder对类进行单元测试

 类似资料:
  • 我在micronaut中有以下接口来执行HTTP POST请求: 我有一个调用接口的类: 我想在我的spock测试中模拟/存根API调用,我尝试了以下方法: 然而,我得到的错误:

  • 1)创建groovy项目 2)创建接口: 3)创建spock测试: 有没有更好的方法来“解释”spock被模仿函数的最后一个参数是vararg,因此可以省略它?

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?

  • 注意:这个示例非常简单,但它得到了我想要实现的跨越的想法。 我有一个类(称为),它接受作为构造函数参数;它有一个方法,该方法生成一个执行以下操作的新线程(为简洁起见,大大减少了): 在正常操作中,调用会阻塞,直到与建立连接为止。 但这让我产生了错误的感觉;我不是真的在寻找至少一个互动,我真的在寻找一个互动。 我可以这样做(返回一次模拟的套接字,然后返回null): 但是,我仍然有大量对的调用,这些

  • 这里,在引擎盖下调用。因此,我需要我的模拟实例返回(指示失败的auth),或者在发生意外情况时抛出。 你知道我该怎么做吗?