io.mock.verify校验错误队列名问题排查
问题分析与解决方案
核心问题
错误信息显示测试中SqsTemplate仅被调用了1次,且参数是入站队列名some-queue-name——这说明你的程序根本没有触发向出站队列some-queue-out的发送操作,只有对入站队列的调用被捕获到了。
排查与解决步骤
1. 先确认业务逻辑正确性
- 检查处理入站消息的代码,确认是否存在
sqsTemplate.send("some-queue-out", ...)的调用逻辑,有没有写错队列名,或者是否因为分支判断(比如消息格式不合法、条件不满足)导致这行代码未执行。 - 可以在业务代码中添加日志,打印实际调用
send时使用的队列名,确认是否真的传入了some-queue-out。
2. 测试代码问题排查
- 验证Mock实例一致性:确保测试中通过
@MockBean(或其他方式)创建的SqsTemplate,和程序实际运行时使用的是同一个实例。如果存在多个SqsTemplate实例,测试的Mock可能无法拦截到真实的调用。 - 处理异步执行场景:如果消息处理逻辑用了
@Async注解(异步执行),测试代码会在异步任务完成前就执行verify,导致捕获不到出站队列的调用。解决方法:- 用
CountDownLatch在测试中等待异步任务完成:val latch = CountDownLatch(1) // 在业务代码发送完出站队列后调用 latch.countDown() latch.await(5, TimeUnit.SECONDS) verify(atLeast = 1) { sqsTemplate.send("some-queue-out", any()) } - 或者在测试配置中将Spring异步执行器设为同步模式。
- 用
- 简化匹配器排查:尝试把
any<Array<OutMessage>>()换成any(),排除Kotlin泛型匹配导致的校验失败问题,先验证队列名是否正确。
3. 验证调用次数与顺序
先不指定队列名,校验SqsTemplate.send的总调用次数:
verify(sqsTemplate, times(2)) { send(anyString(), any()) }
如果结果显示仅1次调用,说明确实未触发出站队列的发送;如果有2次调用,再用顺序校验确认两次调用的队列名:
inOrder(sqsTemplate) { send(eq("some-queue-name"), any()) send(eq("some-queue-out"), any()) }
内容的提问来源于stack exchange,提问作者Traumlos
相关产品推荐
相关产品推荐

