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
相关产品推荐
相关产品推荐

