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

