I have a class A that publishes event E1. E1 is consumed by class B in the same application that is annotated with @RabbitListener
. B does some things and then publishes event E2 that is consumed by C etc etc (forming a process chain).
What I want to do is two things:
RabbitListener's
so that the entire process that is the result of E1 being published is not executed. I only want to assert that A does what it's supposed to and publishes E1. I have managed to accommodate this by setting spring.rabbitmq.listener.auto-startup=false
.RabbitListerner
correctly. But again I don't want C to be called as a side-effect of E2 being published.I know I can probably do this using mocks but preferably I'd like to test the real deal and using the actual components (including sending the message to an actual RabbitMQ instance that in my case is running in Docker).
Can I achieve this in a nice way in Spring Boot? Or is it perhaps recommended to use @RabbitListenerTest
and indeed use mocks?
The @RabbitListener
has id
property:
/**
* The unique identifier of the container managing for this endpoint.
* <p>If none is specified an auto-generated one is provided.
* @return the {@code id} for the container managing for this endpoint.
* @see org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry#getListenerContainer(String)
*/
String id() default "";
And that RabbitListenerEndpointRegistry#getListenerContainer(String)
returns MessageListenerContainer
and there you already can control start()/stop()
of individual @RabbitListener
handler.