我有以下流程:
@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
。但我意识到PaymentRegisteredEvent
的@EventSourcingHandler
方法在测试时从未被激发,因此ReturnPaymentCommand
从未被调用。
我能做什么,或者我做错了什么?
我相信您混淆了两种类型的测试。
- 骨料试验
对于这种类型的测试,Axon Framework提供了AggregateTestFixture
来帮助您。正如您可能已经在做的那样,这些测试是给定/何时/然后的形式,并且应该验证命令和事件流是否是正确的和预期的。
例如:
aggregateFixture.given(new AnyEvent())
.when(new AnyCommand())
.expectEvents(new ExpectedEvent());
或expectException
、expectNoEvents
等
- 消息处理程序组件测试
该组件应该像任何其他组件一样进行单元测试。为此,您可以简单地模拟您需要的任何东西(通常是您的存储库(,并在调用给定组件的方法时测试您是否执行了需要执行的操作(例如保存/更新/删除条目(
例如:
@Test
void testAnyEventHandlerMethod() {
messageHandler.on(new AnyEvent());
verify(myMockedRepository).save(entityDerivedFromEvent());
}