Сценарий:
Junit для микросервиса, который прослушивает очередь и публикует сообщения в rabbitMQ после извлечения данных.
Выпуск:
RabbitListenerTestHarness создает фиктивный объект для Кролика
Только класс слушателя, Реальные объекты создаются для
Слушатели автонастройки компонентов
Я не смог найти способ вручную ввести фиктивные бины в слушатель. Это заставляет Junit отправлять тестовые сообщения в фактические очереди, настроенные в микросервисе, во время выполнения Junit.
Обходной путь: Единственный способ, которым я мог бы использовать проект rabbit-test, - это настроить тестовый обмен для публикации сообщений во время выполнения Junit.
Запрос:
Я хотел понять, есть ли способ написать Junit для Rabbit Listener. Также я хотел понять, есть ли способ вручную вводить фиктивные объекты в компоненты проводной системы Rabbit Listeners.
Пример кода Фрагмент кода:
Класс слушателя кролика
@RabbitListener(id = "id", bindings = @QueueBinding(value = @Queue(value = "sampleQueue", durable = "true", autoDelete = "false"),key = "sampleRoutingKey", exchange = @Exchange(value = "sampleExchange", durable = "true", ignoreDeclarationExceptions = "true", type = EXCHANGE_TYPE)))
public void getMessageFromQueue(@Payload EventModel event) throws ListenerExecutionFailedException, JAXBException {
dataExporterService.exportDataAndPostToRabbit(event);
}
Класс обслуживания
@Autowired
DataExtractorRepository dataExtractorRepository;
@Autowired
DataPublihserRepository dataPublisherRepo;
public void exportDataAndPostToRabbit(EventModel event) throws JAXBException {
dataPublisherRepo.sendMessageToExchange(dataExtractorRepository.extractOrderData(event), exchangeName, routingKeyValue);
}
DataPublihserRepository имеет шаблон rabbitTemplate с внутренней автопроводкой. DataExtractorRepository подключается к БД для извлечения сообщения.
Тестовый класс
@Autowired
private RabbitListenerTestHarness harness;
@Autowired
private RabbitTemplate rabbitTemplate;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
DataExporterController = this.harness.getSpy("id");
}
@Test
public void shouldReceiveMessage() throws Exception {
LatchCountDownAndCallRealMethodAnswer answer = new LatchCountDownAndCallRealMethodAnswer(1);
doAnswer(answer).when(DataExporterController).getMessageFromQueue(any(EventModel.class));
rabbitTemplate.convertAndSend("sampleExchange", "sampleRoutingKey", createMessage());
assertTrue(answer.getLatch().await(10, TimeUnit.SECONDS));
verify(DataExporterController, times(1)).getMessageFromQueue(any(OrderEventsModel.class));
verify(orderDataExporterController, times(1)).getMessageFromQueue(any(OrderEventsModel.class));
}
private Message createMessage() {
String inputObject = "{\"id\":12345}";
MessageProperties props = MessagePropertiesBuilder.newInstance().setContentType(MessageProperties.CONTENT_TYPE_JSON).build();
return new Message(inputObject.getBytes(), props);
}