java - 无法在 Spock 中 stub Kafka 生产者记录

标签 java unit-testing apache-kafka spock

我正在尝试使用 Spock 对一些 Kafka 代码进行单元测试,但在 stub 对 KafkaProducer.send() 函数的响应时遇到问题。这是我需要绕过的 Java 代码行:

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

这是我的 Spock 代码:

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 不是抽象的,不是接口(interface),并且肯定有一个构造函数,那么给出了什么?

最佳答案

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

given:
def sendResult = Mock(Future)
...

then:
1 * producer.send(_ as ProducerRecord) >> sendResult
1 * sendResult.get() >> obj

关于java - 无法在 Spock 中 stub Kafka 生产者记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883451/

相关文章:

unit-testing - grails在单元测试中使用get()时,命名查询给出null

java - 在 Scene2D 中移动 Sprite

java - 用java中的空格替换json字符串中的特殊字符(不可打印的字符)

javascript - 通过 $.ajax() 发送表单元素和数组

java - 有谁知道一些返回操作系统友好文件名的 Java 类?

unit-testing - 如何从子目录访问测试方法

unit-testing - 为什么 nUnit 测试经常在 Visual Studio 2015 中消失?

kubernetes - Kafka + Kubernetes + Helm + `/usr/bin/kafka-avro-console-consumer`吗?

apache-kafka - 如何在librdkafka中使用rd_kafka_poll_set_consumer?

java - 从 bootstrap server 和 zookeeper 消费消息有什么区别?