如何解决axon测试时如何调用@EventHandler?
我有以下流程:
@CommandHandler
public PaymentsAggregate(RegisterPaymentCommand command){...}
@EventSourcingHandler
public void on(PaymentRegisteredEvent event){...}
@EventHandler
public void on(PaymentRegisteredEvent event){
paymentRepository.save(event.getPayment());
if(someCondition)
commandGateway.send(new ReturnPaymentCommand(...));
}
@CommandHandler
public void handle(ReturnPaymentCommand command){...}
@EventSourcingHandler
public void on(PaymentReturnedEvent event){...}
@EventHandler
public void on(PaymentReturnedEvent event){...}
我想测试我的 RegisterPaymentCommand
,有时它会触发 ReturnPaymentCommand
。因此,在我的 expectEvents
中,我有 PaymentRegisteredEvent
和 PaymentReturnedEvent
。但我意识到 @EventSourcingHandler
的 PaymentRegisteredEvent
方法在测试时永远不会被触发,所以 ReturnPaymentCommand
永远不会被调用。
我能做什么或我做错了什么?
解决方法
我相信您在这里混淆了两种类型的测试。
- 综合测试
对于此类测试,Axon 框架提供了 AggregateTestFixture
来帮助您。正如您可能已经在做的那样,这些测试采用给定/何时/那么的形式,并且应该验证命令和事件流是否正确且符合预期。
例如:
aggregateFixture.given(new AnyEvent())
.when(new AnyCommand())
.expectEvents(new ExpectedEvent());
或expectException
、expectNoEvents
等
- 消息处理程序组件测试
这个组件应该像任何其他组件一样进行单元测试。为此,您可以简单地模拟您需要的任何内容(通常是您的存储库),并在调用给定组件的方法时进行测试,您是否执行需要执行的操作(例如保存/更新/删除条目)
例如:
@Test
void testAnyEventHandlerMethod() {
messageHandler.on(new AnyEvent());
verify(myMockedRepository).save(entityDerivedFromEvent());
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。