如何在 spring 集成中模拟出站网关
how to mock outbound gateways in spring integration
我目前正在学习 spring 集成框架。因此,如果我的问题很荒谬,请原谅并纠正我。
如何或有没有办法模拟一个 http 出站网关到 运行 我的单元 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}&MobleNo={MobleNo}&smsType={smsType}&Message={Message}")
.expectedResponseType(String.class).httpMethod(HttpMethod.GET)
.uriVariableExpressions(createExpressionMap()))
.transform(Transformers.fromJson(SmsResponseDto.class, mapper)).get();
}
这是我的集成流程。
另外,我们可以使用 mockmvc 来测试入站网关吗?
是的,应用程序中的任何 handle()
(或更好地说 MessageHandler
)都可以被模拟。为此,我们需要 @SpringIntegrationTest
和 MockIntegration
API.
在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/testing.html#testing
是的,有了 HTTP,我们真的可以使用 Mock MVC 框架及其 MockMvcClientHttpRequestFactory
注入到 Http.outboundGateway()
所代表的 HttpRequestExecutingMessageHandler
中。
将 bean id 添加到处理程序,
@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 集成的新手。所以我不知道这是否是正确的方法。无论如何,它正在工作:D。如果我错了,请纠正。 :)
感谢 Artem Bilan 的帮助。
我目前正在学习 spring 集成框架。因此,如果我的问题很荒谬,请原谅并纠正我。 如何或有没有办法模拟一个 http 出站网关到 运行 我的单元 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}&MobleNo={MobleNo}&smsType={smsType}&Message={Message}")
.expectedResponseType(String.class).httpMethod(HttpMethod.GET)
.uriVariableExpressions(createExpressionMap()))
.transform(Transformers.fromJson(SmsResponseDto.class, mapper)).get();
}
这是我的集成流程。
另外,我们可以使用 mockmvc 来测试入站网关吗?
是的,应用程序中的任何 handle()
(或更好地说 MessageHandler
)都可以被模拟。为此,我们需要 @SpringIntegrationTest
和 MockIntegration
API.
在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/testing.html#testing
是的,有了 HTTP,我们真的可以使用 Mock MVC 框架及其 MockMvcClientHttpRequestFactory
注入到 Http.outboundGateway()
所代表的 HttpRequestExecutingMessageHandler
中。
将 bean id 添加到处理程序,
@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 集成的新手。所以我不知道这是否是正确的方法。无论如何,它正在工作:D。如果我错了,请纠正。 :)
感谢 Artem Bilan 的帮助。