У меня есть следующий поток, реализованный в Spring Integration DSL:
- Получение канала из заголовка HTTP
- Обогащение errorChannel (точка обработки всех исключений ниже по потоку здесь).
- Преобразование сообщения в коллекцию
- Разделение коллекции на отдельные сообщения
- Отправка каждого сообщения на следующие каналы обработки
@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, определенный в заголовке?