Hi,
I’ve a case where my saga listens to an event together with its sequenceNumber:
@SagaEventHandler(associationProperty = "fooId")
public void on(final FooEvent event, @SequenceNumber Long version) {
// do some stuff
}
However, when I try to test this method using SagaTestFixture
, the method is never called.
When I remove “@SequenceNumber Long version”, the method is called by the test.
The test looks like this:
private SagaTestFixture<FooSaga> fixture = fixture = new SagaTestFixture<>(AssignConnectScheduleSaga.class);
@BeforeEach
void setUp() {
fixture.registerResource(new SequenceNumberParameterResolverFactory());
}
@Test
public void shouldHandleFooEvent() {
fixture.whenPublishingA(new FooEvent("fooId-123", "FooBar")
.expectActiveSagas(1)
}
When I take a look at SequenceNumberParameterResolverFactory
that resolves parameters of @SequenceNumber
, it expects a Message of DomainEventMessage
:
public static class SequenceNumberParameterResolver implements ParameterResolver<Long> {
@Override
public Long resolveParameterValue(Message message) {
if (message instanceof DomainEventMessage) {
return ((DomainEventMessage) message).getSequenceNumber();
}
return null;
}
@Override
public boolean matches(Message message) {
return message instanceof DomainEventMessage;
}
}
The problem seems to reside in SagaTestFixture
that only seems to publish messages of
EventMessage
that is a parent interface of DomainEventMessage
:
@Override
public FixtureExecutionResult whenPublishingA(Object event, Map<String, ?> metaData) {
EventMessage<?> msg = GenericEventMessage.asEventMessage(event).andMetaData(metaData);
fixtureExecutionResult.startRecording();
handleInSaga(timeCorrectedEventMessage(msg));
return fixtureExecutionResult;
}
private EventMessage<Object> timeCorrectedEventMessage(Object event) {
EventMessage<?> msg = GenericEventMessage.asEventMessage(event);
return new GenericEventMessage<>(msg.getIdentifier(), msg.getPayload(), msg.getMetaData(), currentTime());
}
Is there any way that I can override the current behavior, so I can simulate domain event messages in my Saga test?