You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spock测试MnsTemplate.sendMessage时调用次数不足异常的修复方案

问题修复方案

针对你使用Spock测试MnsTemplate时,Mock的CloudQueue.putMessage未被触发的问题,可按以下步骤排查修复:

1. 确认Mock对象注入与交互设置

确保MnsTemplate使用的是你Mock的CloudQueue实例,且交互顺序和返回值正确:

given:
def mnsClient = Mock(MNSClient)
def queue = Mock(CloudQueue)
def mnsTemplate = new MnsTemplate(mnsClient: mnsClient)

when:
mnsTemplate.sendMessage("test-queue", "Test Message")

then:
// 先确保getQueueRef返回Mock的queue
1 * mnsClient.getQueueRef("test-queue") >> queue
// 先用宽松匹配确认方法是否被调用
1 * queue.putMessage(_ as Message)

2. 确保final类Mock生效

由于CloudQueue是final类,需保证mockito-inline的配置正确:

  • 在src/test/resources下创建mockito-extensions/org.mockito.plugins.MockMaker文件,内容为:
    mock-maker-inline
    
  • 检查依赖版本兼容性:Spock 2.4-M4依赖Mockito 5.x,需确保mockito-inline也是对应版本,比如:
    testImplementation 'org.mockito:mockito-inline:5.6.0'
    

3. 修复参数匹配问题

如果严格匹配new Message("Test Message")失败,大概率是Message类未正确实现equals/hashCode,改用参数匹配器:

// 匹配消息体为指定内容的Message对象
1 * queue.putMessage({ it.body == "Test Message" })

// 或使用Mockito的eq匹配器(需导入静态方法)
import static org.mockito.ArgumentMatchers.eq
1 * queue.putMessage(eq(new Message("Test Message")))

4. 排查业务逻辑分支

确认MnsTemplate的sendMessage方法没有跳过putMessage的分支逻辑:

  • 检查队列名称是否与测试中传入的一致
  • 查看是否有异常捕获后未执行putMessage的情况
  • 可添加断点或日志跟踪代码执行路径

5. 适配JDK21兼容性

Spock 2.4-M4作为预览版,需配置Groovy编译参数适配JDK21:

tasks.withType(GroovyCompile) {
    groovyOptions.forkOptions.jvmArgs += '--add-opens=java.base/java.lang=ALL-UNNAMED'
    groovyOptions.forkOptions.jvmArgs += '--add-opens=java.base/java.util=ALL-UNNAMED'
}

内容的提问来源于stack exchange,提问作者user27846561

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:57:06