Junit для компонентов интеграции Spring - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующие настройки конфигурации для вызова службы 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;
}

Ниже приведена конфигурация шлюза и активатора службы для отправки запроса и получения ответа.

@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()
        );
}

Язастрял на том, как написать Junit для этого потока.Я не уверен, нужно ли мне реструктурировать этот поток в IntegrationFlow, который помог бы с написанием тестов Junit для этого.Посоветовать нужно.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

С помощью ответа Артема

@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));

        }
    });
}
0 голосов
/ 11 мая 2018

Не знаю, какая у вас проблема, но вам нужно просто получить для этого бин-шлюз sendRequest() и вызвать его:

@Autowired
MyGateway myGateway;

@Test
void myTest() {
    this.myGateway.sendRequest(...);
}

Не знаю, почему вы не ожидаете от этого возврата?метод шлюза, но в любом случае это ваша логика.Чтобы обработать ответ в responseChannel, вы можете рассмотреть возможность использования Spring Integration Testing Framework с его MockIntegration.mockMessageHandler() и MockIntegrationContext.substituteMessageHandlerFor() для замены этого receiveResponse() Service Activator чем-то, что вы можете проверить и подтвердить в тестовом примере..

См. Дополнительную информацию в Справочном руководстве: https://docs.spring.io/spring-integration/docs/5.0.5.RELEASE/reference/html/testing.html#test-context

ОБНОВЛЕНИЕ

К сожалению, мы не можем выполнить обновление до версии 5.0.5.,Не могли бы вы привести меня к документации по весеннему интеграционному тестированию для версии 4.3.9

Нет, такого нет.Это действительно новая функциональность в Spring Integration 5.0: https://docs.spring.io/spring-integration/docs/5.0.5.RELEASE/reference/html/whats-new.html.

Вы можете получить бин requestChannel и вызвать его addInterceptor(ChannelInterceptor interceptor) перед выполнением тестового примера.В ChannelInterceptor.perSend() вы можете получить ответное сообщение и проверить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...