用于Spring集成组件的Junit

用于Spring集成组件的Junit,junit,spring-integration,spring-test,Junit,Spring Integration,Spring Test,我有以下调用REST服务的配置设置 @Bean public MessageChannel requestChannel() { SubscribableChannel requestChannel= new DirectChannel(); return requestChannel; } @Bean public MessageChannel responseChannel() { SubscribableChannel responseChannel = new

我有以下调用REST服务的配置设置

@Bean
public MessageChannel requestChannel() {
    SubscribableChannel requestChannel= new DirectChannel();
    return requestChannel;
}

@Bean
public MessageChannel responseChannel() {
    SubscribableChannel responseChannel = new DirectChannel();
    return responseChannel;
}

@Bean
@ServiceActivator(inputChannel = "requestChannel")
public MessageHandler httResponseMessageHandler(MessageChannel responseChannel,
        HeaderMapper<HttpHeaders> headerMapper, RequestHandlerRetryAdvice retryAdvice) {
    List<Advice> list = new ArrayList<>();
    list.add(retryAdvice);
    HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://localhost:8080/myrest/service/");
    handler.setHttpMethod(HttpMethod.POST);
    handler.setHeaderMapper(headerMapper);
    handler.setOutputChannel(responseChannel);
    handler.setExpectedResponseType(RtpResponse.class);
    handler.setAdviceChain(list);
    return handler;
}
@Bean
public MessageChannel requestChannel(){
SubscribableChannel requestChannel=新的DirectChannel();
返回请求通道;
}
@豆子
公共消息频道响应频道(){
SubscribableChannel responseChannel=new DirectChannel();
返回响应通道;
}
@豆子
@ServiceActivator(inputChannel=“requestChannel”)
公共消息处理程序httResponseMessageHandler(消息通道响应通道,
HeaderMapper HeaderMapper,RequestHandlerRetryAdvice(返回建议){
列表=新的ArrayList();
列表。添加(retryAdvice);
HttpRequestExecutingMessageHandler=新的HttpRequestExecutingMessageHandler(“https://localhost:8080/myrest/service/");
handler.setHttpMethod(HttpMethod.POST);
handler.setHeaderMapper(headerMapper);
handler.setOutputChannel(响应通道);
setExpectedResponseType(RtpResponse.class);
handler.setAdviceChain(列表);
返回处理程序;
}
下面是网关和服务激活器发送请求和获取响应的配置

@Override
@ServiceActivator(inputChannel="responseChannel")
public void receiveResponse(Message<RtpResponse> message) {
    LOGGER.info("Message: " + message);
    LOGGER.info("Message: " + message.getPayload());
    LOGGER.info(message.getClass().getCanonicalName());
}

@Override
@Gateway(requestChannel = "requestChannel")
public void sendRequest(RtpRequestBody requestBody) {
    requestChannel
    .send(
            MessageBuilder.withPayload(requestBody)
            .setHeader("Accept","application/json")
            .setHeader(MessageHeaders.CONTENT_TYPE,"application/json")
            .setHeader(MessageHeaders.ERROR_CHANNEL,errorChannel)
            .build()
        );
}
@覆盖
@ServiceActivator(inputChannel=“responseChannel”)
公共无效接收方响应(消息){
LOGGER.info(“消息:”+消息);
LOGGER.info(“Message:+Message.getPayload());
LOGGER.info(message.getClass().getCanonicalName());
}
@凌驾
@网关(requestChannel=“requestChannel”)
公共无效sendRequest(RtpRequestBody requestBody){
请求通道
.发送(
MessageBuilder.withPayload(请求主体)
.setHeader(“接受”、“应用程序/json”)
.setHeader(MessageHeaders.CONTENT_类型,“application/json”)
.setHeader(MessageHeaders.ERROR\u通道,errorChannel)
.build()
);
}

我一直在研究如何为这个流编写Junit。我不确定是否需要将此流重组为IntegrationFlow,这将有助于为此编写Junit测试。需要建议

不确定您遇到了什么问题,但您只需要为该
sendRequest()
获取一个网关bean并调用它:

@Autowired
MyGateway myGateway;

@Test
void myTest() {
    this.myGateway.sendRequest(...);
}
虽然不确定为什么不期望从网关方法返回,但这是您的逻辑。为了处理<代码>响应通道<代码>,您可以考虑使用Spring集成测试框架,其代码< > McCnTeTrase.McCKMasAdHell()/<代码> >代码> McKyTeGraseCurror。ServiceActivator,其中包含您可以在测试用例中验证和断言的内容

请参阅参考手册中的更多信息:

更新

很遗憾,我们无法升级到5.0.5版。您能给我介绍一下4.3.9版的spring集成测试文档吗

不,没有这样的人。这确实是SpringIntegration5.0中的一个新功能:


在执行测试用例之前,您可以获取
requestChannel
bean并调用它的
addInterceptor(ChannelInterceptor interceptor)
。在
ChannelInterceptor.perSend()
中,您可以获得回复消息并进行验证

在阿泰姆回答的帮助下

@Autowired
private SubscribableChannel employeeGetMethodResponseChannel;

@Autowired
private EmployeeSearchService employeeSearchService;

@Mock
private RestTemplate restTemplateMock;

private EmployeeDetail employeeDetailInResponse;

private Employee employeeInRequest;

@Before
public void setUp() {
    employeeInRequest = new Employee();
    employeeInRequest.setEmployeeId(1L);

    employeeDetailInResponse = new EmployeeDetail();
    employeeDetailInResponse.setEmployeeId(1L);
}

@Test
public void testGetRequest() {
    Mockito.when(restTemplateMock.postForObject("https://localhost:8080/myrest/service/", EmployeeDetail.class))
            .thenReturn(employeeDetailInResponse);
    this.employeeSearchService.employeeSearch(employeeInRequest);
}

@Test
public void testResponse() {
    this.responseChannel.subscribe(new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            Assert.assertTrue("Test failed", ((EmployeeDetail) message.getPayload()).getEmployeeId().equals(1L));

        }
    });
}
@Autowired
私人订阅频道employeeGetMethodResponseChannel;
@自动连线
私人雇员搜索服务雇员搜索服务;
@嘲弄
私有RESTTemplateRestTemplateMock;
私人雇员详细雇员详细回应;
私人雇员要求;
@以前
公共作废设置(){
employeeInRequest=新员工();
employeeInRequest.setEmployeeId(1L);
EmployeeDetailResponse=新EmployeeDetail();
EmployeeDetailResponse.setEmployeeId(1L);
}
@试验
public void testGetRequest(){
Mockito.when(restTemplateMock.postForObject(“https://localhost:8080/myrest/service/“,EmployeeDetail.class))
.然后返回(EmployeeDetailResponse);
此.employeeSearch服务.employeeSearch(employeeInRequest);
}
@试验
公共void testResponse(){
this.responseChannel.subscribe(newmessagehandler()){
@凌驾
public void handleMessage(消息消息消息)引发MessaginException{
Assert.assertTrue(“测试失败”((EmployeeDetail)message.getPayload()).getEmployeeId().equals(1L));
}
});
}

Hello Artem,很遗憾,我们无法升级到5.0.5版。您能给我介绍版本4.3.9的spring集成测试文档吗?谢谢