Spring integration 如何在spring集成中模拟出站网关

Spring integration 如何在spring集成中模拟出站网关,spring-integration,Spring Integration,我目前正在学习spring集成框架。所以,如果我的问题是荒谬的,请原谅并纠正我。 如何模拟http出站网关来运行我的单元实例 public IntegrationFlow sendSms() { final ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

我目前正在学习spring集成框架。所以,如果我的问题是荒谬的,请原谅并纠正我。 如何模拟http出站网关来运行我的单元实例

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();
    }
public IntegrationFlow sendSms(){
最终ObjectMapper ObjectMapper=新ObjectMapper();
configure(MapperFeature.ACCEPT\u不区分大小写的\u属性,true);
最终JsonObjectMapper映射器=新Jackson2JsonObjectMapper(objectMapper);
返回IntegrationFlows.from(“SendsMsgGatewayRequestChannel”)
.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

请参阅文档中的更多信息:

是的,有了HTTP,我们真的可以使用模拟MVC框架及其
MockMvcClientHttpRequestFactory
注入到
HttpRequestExecutingMessageHandler
中,由
HTTP.outboundGateway()
表示


请参阅文档中的更多内容:

将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();
    }
@Bean
公共集成流发送SMS(){
最终ObjectMapper ObjectMapper=新ObjectMapper();
configure(MapperFeature.ACCEPT\u不区分大小写的\u属性,true);
最终JsonObjectMapper映射器=新Jackson2JsonObjectMapper(objectMapper);
返回IntegrationFlows.from(“SendsMsgGatewayRequestChannel”)
.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);

final arguments captorhi Bilan,我需要对流程进行单元测试。不是集成测试。所以我不想为此设置模拟服务器。在模拟测试整个流之后,有没有办法得到响应?在我创建的集成流中,我也添加了一个Transformer。那么,“mockIntegrationContext.substituteMessageHandlerFor”方法有没有其他的替代方法呢?当您处理完全成熟的服务之间的交互时,它被称为“集成”测试,在大多数情况下是通过网络进行的。mock MVC的一个目标就是让我们避免这样的负担,而代之以简单的单元测试。
substituteMessageHandlerFor
也适用于transformer。即使它是网关、拆分器或聚合器,仍然有一些
MessageHandler
,我们可以用模拟的来替代。您的代码和逻辑完全正确。由于
Http.outboundGateway()
是基于
HttpRequestExecutingMessageHandler
的,它本质上是一个
MessageHandler
实现,因此使用
substituteMessageHandlerFor
模拟该Http请求确实可以。同样可以在您的流程的任何集成点中完成。始终欢迎!是时候考虑一下了:我已经创建了一个HTTPREQUESTEXECUTION消息处理程序的实际bean。有没有办法像上面的方法一样模仿它的反应?我无法使用mockIntegrationContext.substituteMessageHandlerFor。子位置所期望的是IntegrationConsumerBean。而不是HttpRequestExecutingMessageHandler bean。有没有办法模仿它?看看我的答案:模仿MVC是给你的。尽管如果通过向要模拟的端点的通道发送消息来调用它,您仍然可以使用substitute。