как имитировать исходящие шлюзы в интеграции Spring

#spring-integration

#spring-интеграция

Вопрос:

В настоящее время я изучаю spring integration framework. Поэтому, пожалуйста, простите и поправьте меня, если мой вопрос абсурден. как или есть ли способ имитировать исходящий http-шлюз для запуска моего unit tastcase?

 public IntegrationFlow sendSms() {
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        final JsonObjectMapper<?, ?> mapper = new Jackson2JsonObjectMapper(objectMapper);
        return IntegrationFlows.from("sendSmsGatewayRequestChannel")
                .handle(Http
                        .outboundGateway(environment.getProperty("integration.sms.endpoint")
                                  "?ProductType={ProductType}amp;MobleNo={MobleNo}amp;smsType={smsType}amp;Message={Message}")
                        .expectedResponseType(String.class).httpMethod(HttpMethod.GET)
                        .uriVariableExpressions(createExpressionMap()))
                .transform(Transformers.fromJson(SmsResponseDto.class, mapper)).get();
    }
 

это мой поток интеграции.

Кроме того, можем ли мы использовать mockmvc для тестирования входящего шлюза?

Ответ №1:

добавьте идентификатор компонента в обработчик как,

 @Bean
    public IntegrationFlow sendSms() {
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        final JsonObjectMapper<?, ?> mapper = new Jackson2JsonObjectMapper(objectMapper);
        return IntegrationFlows.from("sendSmsGatewayRequestChannel")
                .handle(Http.outboundGateway(smsEndpoint).expectedResponseType(String.class).httpMethod(HttpMethod.GET)
                        .uriVariableExpressions(createExpressionMap()), **e -> e.id("smsOutboundGateway")**)
                .transform(Transformers.fromJson(SmsResponseDto.class, mapper)).get();
    }
 

затем вы можете имитировать ответ с помощью,

 final ArgumentCaptor<Message<?>> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
        final MessageHandler mockMessageHandler = MockIntegration.mockMessageHandler(messageArgumentCaptor)
                .handleNextAndReply(m -> MessageBuilder.withPayload(
                        "response")
                        .build());
        mockIntegrationContext.substituteMessageHandlerFor("smsOutboundGateway", mockMessageHandler);
 

Примечание: я новичок в Spring integration. так что я не знаю, правильный ли это способ сделать это. в любом случае, это работает: D. исправьте, если я ошибаюсь. 🙂

Спасибо Артему Билану за помощь.

Комментарии:

1. Ваш код и логика полностью верны. Поскольку Http.outboundGateway() он основан на HttpRequestExecutingMessageHandler , который по сути является MessageHandler реализацией, его действительно можно использовать substituteMessageHandlerFor для моделирования HTTP-запросов. То же самое можно сделать в любой точке интеграции вашего потока.

2. я создал фактический компонент HttpRequestExecutingMessageHandler . есть ли какой-либо способ имитировать его ответ, подобный описанному выше методу? я не могу использовать mockIntegrationContext.substitutemessagehandlerf. что ожидается для подстановки, так это компонент IntegrationConsumer. вместо компонента HttpRequestExecutingMessageHandler. есть ли какой-нибудь способ издеваться над этим?

3. Тогда смотрите мой ответ: макет MVC для вас там. Хотя вы все равно можете использовать substitute, если вызываете его через отправку сообщений на канал конечной точки, которую хотите имитировать.

Ответ №2:

Да, любой handle() (или лучше сказать MessageHandler ) в приложении можно издеваться. Для этой цели нам нужен @SpringIntegrationTest MockIntegration API and .

Смотрите больше информации в документах: https://docs.spring.io/spring-integration/docs/current/reference/html/testing.html#testing

И да, с HTTP мы действительно можем использовать макет MVC-фреймворка и MockMvcClientHttpRequestFactory вводить его в HttpRequestExecutingMessageHandler представленный им Http.outboundGateway() .

Подробнее в документах: https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#spring-mvc-test-client

Комментарии:

1. Привет, Билан, мне нужно выполнить модульное тестирование потока. Не интеграционный тест. Поэтому я не хочу создавать для этого фиктивные серверы. есть ли какой-нибудь способ получить ответ после издевательства над тестированием всего потока?

2. в потоке интеграции, который я создал, я также добавил atransformer. итак, есть ли какой-либо альтернативный способ для метода «mockIntegrationContext.substituteMessageHandlerFor»?

3. Это называется «интеграционным» тестом, когда вы имеете дело с взаимодействием между полноценными сервисами, в большинстве случаев по сети. На самом деле цель mock MVC — позволить нам избежать такого бремени и вместо этого провести простой модульный тест.

4. substituteMessageHandlerFor Работа и для трансформатора тоже. Даже если это шлюз, или разделитель, или агрегатор, все равно есть что-то MessageHandler , что мы можем заменить на подделку.