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

Axon4.5.12 Saga测试报未找到已调度Deadline错误如何解决

测试运行时抛出错误信息:
Did not find a deadline at the given deadline manager. Expected: <[matches a given predicate]> at <datetime> Got: <no scheduled events>

问题根因

该问题和生产环境的SimpleDeadlineManager自定义配置无关,完全由单元测试的错误配置导致:

  • SagaTestFixture本身内置了测试专用的DeadlineManager实现,会自动记录所有Saga内发起的deadline调度操作,为expectScheduledDeadlineWithName这类断言方法提供校验依据。
  • 手动通过registerResource注册Mockk生成的DeadlineManager模拟实例,会直接覆盖fixture内置的测试专用实例。
  • 对Mock实例的schedule方法仅做了返回固定ID的存根,没有将deadline调度信息同步给fixture的断言校验模块,fixture执行断言时检索不到任何已调度的deadline记录,就会抛出上述错误。
修复方案
  • 删除测试类中所有手动Mock DeadlineManager、注册Mock实例的代码,不需要为fixture额外指定DeadlineManager。SagaTestFixture会自动将内置的测试专用DeadlineManager注入到Saga的事件处理方法参数中,完全兼容生产环境下的DeadlineManager调用逻辑。
    修正后的测试代码如下:
class MySagaTest {
    private val sagaTestFixture = SagaTestFixture(MySaga::class.java)

    @Test
    fun `deadline test`(){
       sagaTestFixture
        .givenAPublished(SomePriorEvent("id"))
        .whenPublishingA(SomeEvent("id"))
        .expectActiveSagas(1)
        .expectNoDispatchedCommands()
        .expectScheduledDeadlineWithName(
             Duration.ofMinutes(10),
             "Deadlinename"
         )
    }
}
  • 如果需要验证DeadlineManager的交互细节(比如校验schedule方法的入参是否符合预期),优先使用SagaTestFixture自带的断言API完成,不需要手动Mock。如果有特殊场景必须替换DeadlineManager实现,需要自行实现调度记录逻辑对接fixture的断言上下文,否则默认的deadline断言方法无法正常生效。

附:问题涉及的生产环境代码本身无逻辑问题,自定义SimpleDeadlineManagerBean配置、Saga内的deadline调度与处理逻辑均符合Axon 4.5.12版本的规范要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:24:20