Тестирование обработки ошибок с прямыми каналами и источником с помощью poller - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть следующий поток, реализованный в Spring Integration DSL:

  1. Получение канала из заголовка HTTP
  2. Обогащение errorChannel (точка обработки всех исключений ниже по потоку здесь).
  3. Преобразование сообщения в коллекцию
  4. Разделение коллекции на отдельные сообщения
  5. Отправка каждого сообщения на следующие каналы обработки
@Bean
    public IntegrationFlow inboundHttpFlow(
        Puller puller,
        HeaderEnricher errorHandlingChannelHeaderEnricher,
        FeedTransformer feedTransformer,
        MessageChannel outputFeedIntegrationChannel
    ) {
        final Consumer<SourcePollingChannelAdapterSpec> pollingSpec = spec ->
            spec
                .poller(Pollers.cron(SCHEDULE_EVERY_HALF_MINUTE)
                    .errorChannel(INBOUND_ERROR_CHANNEL));

        return IntegrationFlows
            .from(puller, pollingSpec)
            .enrichHeaders(errorHandlingChannelHeaderEnricher)
            .transform(feedTransformer)
            .split()
            .channel(outputFeedIntegrationChannel)
            .get();
    }

Где моя errorHandlingChannelHeaderEnricher:

@Component
public class ErrorHandlingChannelHeaderEnricher implements HeaderEnricher {
    @Override
    public void accept(HeaderEnricherSpec spec) {
        spec.header(
            MessageHeaders.ERROR_CHANNEL,
            INBOUND_ERROR_CHANNEL,
            true
        );
    }
}

Когда feedTransformer генерирует исключение в работающем приложении, затем он устанавливает errorChannel , как и ожидалось.Но я не знаю, как написать тест для проверки, если выброшенное исключение переходит к errorChannel , определенному в заголовке?

Когда я пытаюсь смоделировать его в тестовом заданном виде, он не работает, потому что исключение возвращается в вызывающую сторону вместо errorChannel :

// given
Throwable transformerException = new IllegalStateException();
when(feedTransformerMock.apply(any())).thenThrow(transformerException);

// when
var testFeedMessage = MessageBuilder
    .withPayload(pullerResult)
    .build();

inboundHttpFlow.getInputChannel().send(testFeedMessage); // excetpion returns to caller here

// then
verify(errorHandlerSpy).accept(transformerException);

И типичное исключение:

org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is java.lang.IllegalStateException, failedMessage=GenericMessage [payload=test-payload, headers={errorChannel=inboundErrorChannel, id=f77a6a01-9bca-5af3-8352-7edb4c5e94b0, timestamp=1556019833867}]
, failedMessage=GenericMessage [payload=test-payload, headers={errorChannel=inboundErrorChannel, id=f77a6a01-9bca-5af3-8352-7edb4c5e94b0, timestamp=1556019833867}]

Я предполагаю, что из-за DirectChannel и отсутствия поллера в этом тестовом примере по сравнению с реальным потоком (с поллером).Можно ли имитировать это исключение и проверить, действительно ли оно переходит в errorChannel, определенный в заголовке?

1 Ответ

1 голос
/ 23 апреля 2019

Непонятно, что вы пытаетесь проверить.

Зачем вам нужно тестировать фреймворк?

Вам не нужно обогащать заголовки, так как у вас уже есть канал ошибок в опросчике.

Вы правы; отправка на DirectChannel приведет к тому, что вызывающей стороне будет выдано исключение.

Если вы действительно хотите протестировать фреймворк, смейте Puller вместо отправки на входной канал.

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