Я думаю, все зависит от того, что вы действительно пытаетесь проверить и какую ценность для бизнеса это добавляет.
- Вы хотите протестировать сам
RabbitTemplate
? В репозитории Spring есть тесты для этого, но ИМХО вам не нужно этого делать.
- Вы тестируете Spring
Service
и должны убедиться, что сообщение отправлено?
- Хотите, чтобы сообщение достигло пункта назначения?
Для (1) есть несколько примеров именно того типа тестов, которые вы пишете в Spring Framework
здесь, в своих модульных тестах для RabbitTemplate
.
Например, проверка того, что базовый ConnectionFactory
на самом деле создал канал :
txTemplate.execute(status -> {
template.convertAndSend("foo", "bar");
return null;
});
txTemplate.execute(status -> {
template.convertAndSend("baz", "qux");
return null;
});
verify(mockConnectionFactory, Mockito.times(1)).newConnection(any(ExecutorService.class), anyString());
// ensure we used the same channel
verify(mockConnection, times(1)).createChannel();
Для (2), описанного выше, вам не нужно использовать захват аргументов и т. Д. Вы можете добавить макет RabbitTemplate
в сервис, и мне лично нравится либо проверять аргумент, с которым я вызвал метод, либо использовать Mockito#any
и т. Д.
К вашему сведению, с точки зрения утверждений, я бы также взглянул на AssertJ , у него хороший штамп одобрения от Spring, и свободный API для него (особенно с intellisense) делает это очень прост в использовании.
Для (3) я настоятельно рекомендую https://www.testcontainers.org/ (если вы используете docker), и я не проверил его, но может быть JUnit @Rule
для создания брокера RabbitMQ (Я должен проверить это). Я сделал что-то подобное для ActiveMQ Artemis
, который очень быстро запускает брокера для вас, и вы можете использовать сообщения, поставленные в очередь на него.