SagaTestFixture only publishes GenericEventMessages

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?

I’ve found the solution, but will post it for further reference :slight_smile:

As DomainEventMessages are typically triggered from Aggregates, SagaTextFixture provides methods to indicate which aggregate publishes a domain event.

So when I use following method in my test case everything runs as expected:

@Test
public void shouldHandleFooEvent() {
    fixture.whenAggregate("fooId-123").publishes(new FooEvent("fooId-123", "FooBar")
           .expectActiveSagas(1)
}