2016-11-10 4 views
1

Я использую Apache Camel с весной в моем приложении. В настоящее время я работаю над модульным тестом.Apache Camel Beans Unit Testing

Java Code

  • DataRoute класс

    from("direct:getData") 
    .routeId("getData") 
    .bean(DataService.class, "processData") 
    .marshal().json(JsonLibrary.Jackson) 
    .end(); 
    
  • DataService класс

    public Data processData() { 
        return new Data("Hello World"); 
    } 
    
  • класса данных с геттеры, сеттеры и Джексон метод ToString

    private String value; 
    

тест Блок

  • BaseCamelContextUnitText

    public abstract class BaseCamelContextUnitTest extends CamelTestSupport 
    { 
        @Autowired 
        private DataService dataService; 
    
        @Produce 
        private ProducerTemplate producerTemplate; 
    
        public CamelContext getCamelContext() { 
         return camelContext; 
        } 
    
        @Override 
        protected Context createJndiContext() throws Exception { 
         JndiContext context = new JndiContext(); 
         context.bind("dataService", dataService); 
         return context; 
        } 
    
        @Test 
        public void shouldProcessData() throws Exception { 
          RouteDefinition routeDef = getCamelContext().getRouteDefinition("getData"); 
          routeDef.adviceWith((ModelCamelContext) getCamelContext(), new RouteBuilder() { 
    
          @Override 
          public void configure() throws Exception { 
            from("direct:getData") 
            .pipeline("bean:dataService?method=processData"); 
          } 
        }); 
    
        getCamelContext().start(); 
    
        String responseData = "{" 
         + "\"value\":\"Unit test success\"" 
         + "}"; 
    
        Object response = producerTemplate.sendBody("direct:getData", ExchangePattern.InOut, null); 
    
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    ((InputStreamCache) response).writeTo(byteArrayOutputStream); 
    
        assertThat(new String(byteArrayOutputStream.toByteArray()), is(responseData)); 
        } 
        } 
    

Как издеваются

.bean(DataService.class, "processData") 

в блоке тест, чтобы вернуть mock Data Object с его переменной String по умолчанию, как говорят «Успех теста блока», а затем проверить, будет ли маршрут возвращать издеваемый объект вместо объекта с переменной «Hello World» String?

ответ

0

Вы можете autowired в DataService в вашем DataRoute как

@Component 
public class DataRoute extends RouteBuilder { 

    @Autowired 
    private DataService dataService; 

    @Override 
    public void configure() throws Exception { 
     from("direct:getData") 
     .routeId("getData") 
     .bean(dataService, "processData") 
     .marshal().json(JsonLibrary.Jackson) 
     .end(); 
    } 

} 

Таким образом, вы можете дразнить DataService как обычно.

Альтернатива использует beanRef("beanName", "methodName") в Маршруте.