如何编写Spock测试验证异步Lambda内的方法调用次数
Spock校验lambda内部方法调用次数的实现方案
你之前的校验写法不生效的核心原因是:调用getMessageReceiver()仅会返回MessageReceiver类型的lambda实现对象,不会执行lambda内部包裹的代码。lambda里的逻辑只有当MessageReceiver的接口方法被回调触发(即实际收到Pub/Sub消息时)才会执行,因此需要主动触发lambda执行后再做调用次数校验。
具体实现步骤
- 将被测类实例声明为
Spy对象:只有Spy对象既可以保留原有业务逻辑,又能支持Spock对实例内部方法的调用交互校验 - 调用
getMessageReceiver()拿到返回的MessageReceiver实例 - 手动调用
MessageReceiver的接口方法,模拟Pub/Sub消息回调,触发lambda内部逻辑执行 - 在
then块中校验method1()的调用次数恰好为1次
测试代码示例
假设被测类为PubSubListener,测试代码如下:
import com.google.cloud.pubsub.v1.AckReplyConsumer import com.google.cloud.pubsub.v1.MessageReceiver import com.google.pubsub.v1.PubsubMessage import spock.lang.Specification class PubSubListenerSpec extends Specification { def "返回的MessageReceiver收到消息时恰好调用1次method1"() { given: "初始化被测类Spy实例,构造回调所需的mock参数" def listener = Spy(PubSubListener) PubsubMessage testMsg = Mock() AckReplyConsumer testConsumer = Mock() when: "获取接收器实例并主动触发回调逻辑" MessageReceiver receiver = listener.getMessageReceiver() // 模拟Pub/Sub框架触发消息接收回调,执行lambda内代码 receiver.receiveMessage(testMsg, testConsumer) then: "校验method1调用次数符合预期" 1 * listener.method1() } }
补充说明
如果需要校验lambda内的其他逻辑,比如消息消费后的ack操作、消息体解析逻辑,直接在then块中追加对应交互校验即可,例如:
then: 1 * listener.method1() 1 * testConsumer.ack() // 校验消息被正常确认
内容的提问来源于stack exchange,提问作者draca
相关产品推荐
相关产品推荐

