无法与斯波克中的卡夫卡制片人记录存根



我正在尝试使用 Spock 对一些 Kafka 代码进行单元测试,但我在对KafkaProducer.send()函数的响应时遇到了麻烦。以下是我需要了解的 Java 代码行:

Object out = producer.send(record).get()

这是我的斯波克代码:

given:
Object obj = new Object()
KafkaProducer producer = kafkaProducerService.getProducer()
when:
kafkaProducerService.publish(someData)
then:
1 * producer.send(_ as ProducerRecord).get >> obj

我得到的错误是:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '_' with class 'org.spockframework.lang.Wildcard' to class 'org.apache.kafka.clients.producer.ProducerRecord' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: org.apache.kafka.clients.producer.ProducerRecord(org.spockframework.lang.SpreadWildcard)

我什至尝试了producer.send(_).get() >> obj的完整通配符路由,但这也不起作用(使用ProducerRecord非常令人沮丧的建议(:

groovy.lang.MissingMethodException: No signature of method: org.apache.kafka.clients.producer.KafkaProducer.send() is applicable for argument types: (org.spockframework.lang.Wildcard) values: [[*_]]
Possible solutions: send(org.apache.kafka.clients.producer.ProducerRecord), send(org.apache.kafka.clients.producer.ProducerRecord, org.apache.kafka.clients.producer.Callback), find(), find(groovy.lang.Closure), any(), sleep(long)

ProducerRecord不是抽象的,不是接口,肯定有一个构造函数,那么什么呢?

问题似乎在于您的验证以及您链接了两个方法调用(.send().get()(的事实。因此,spock 不会对send而是对get运行验证,并且不识别通配符语法。您可能需要这个:

given:
def sendResult = Mock(Future)
...
then:
1 * producer.send(_ as ProducerRecord) >> sendResult
1 * sendResult.get() >> obj

最新更新