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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:40:10