#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
, что мы можем заменить на подделку.