2017-02-02 25 views
1

Я использовал Spring Integration DSL для реализации потока обработки сообщений.Как интегрировать тестирование Spring IntegrationFlow?

Как я могу на самом деле блок протестировать один IntegrationFlow, может кто-нибудь дать мне пример того, как модульное тестирование, т.е. преобразовать часть этого боба:

@Bean 
public IntegrationFlow transformMessage(){  
    return message -> message    
      .transform(new GenericTransformer<Message<String>, Message<String>>() { 
       @Override 
       public Message<String> transform(Message<String> message) { 

        MutableMessageHeaders headers = 
          new MutableMessageHeaders(message.getHeaders()); 
        headers.put("Content-Type", "application/json"); 
        headers.put("Accept", "application/json");      

        String payload = "Long message"; 
        ObjectMapper mapper = new ObjectMapper(); 

        HashMap<String, String> map = new HashMap<>(); 
        map.put("payload", payload); 

        String jsonString = null; 
        try { 
         jsonInString = mapper.writeValueAsString(map); 
        } catch (JsonProcessingException e) { 
         logger.error("Error:" + e.getMessage());        
        } 

        Message<String> request = new GenericMessage<String>(jsonString 
        , headers);          
        return request;     
       } 
      }) 
      .handle(makeHttpRequestToValidateAcdrMessage())              
      .enrichHeaders(h -> h.header("someHeader", "blah", true)) 
      .channel("entrypoint"); 
} 

Как я могу проверить это?

С уважением!

ответ

1

Те же методы, описанные в testing-samples project in the samples repo могут быть использованы здесь.

Отправлять сообщение на канал transform.input и подписаться на entrypoint, чтобы получить результат (или изменить его на QueueChannel в тестовом случае.

1

Кажется, для меня «модульное тестирование» означает проверку поведения конкретной части системы, небольшого компонента.

Итак, в вашем случае это примерно new GenericTransformer.

так, просто сделайте его как компонент верхнего уровня и выполните тесты против его изолированных экземпляров!

Интеграционные тесты могут быть выполнены против цели IntegrationFlow.

Каждый ОПЗ-компонент в определении потока окружен MessageChannel с - input и output. Даже если вы не объявляете .channel() там, Framework строит неявный DirrectChannel для подключения конечных точек к потоку.

Тот неявный получить имя боба, как:

channelBeanName = flowNamePrefix + "channel" + 
           BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR + channelNameIndex++; 

Так, так как ваш IntegrationFlow от Lambda, входной канал образует .transform() только вход потока - transformMessage.input.

Канал между .transform() и следующим .handle() имеет имя бина как: transformMessage.channel#0, потому что это будет первое неявное объявление канала.

Идея, что вы можете @Autowired оба этих канала на свой тестовый корпус и добавить ChannelInterceptor к ним перед тестированием.

ChannelInterceptor может играть роль проверяющего, чтобы быть уверенным, что вы отправляете на трансформатор и получаете от соответствующих данных, как ожидается.

Более подробную информацию можно найти здесь: https://github.com/spring-projects/spring-integration-java-dsl/issues/23

 Смежные вопросы

  • Нет связанных вопросов^_^