2016-11-17 3 views
1

У меня есть следующий маршрут в моей службы:Camel: Mock и возвращаемое значение из компонента в маршруте

public void configure() { 

    /* 
    * Scheduled Camel route to produce a monthly report from the audit table. 
    * This is scheduled to run the first day of every month. 
    */ 

    // @formatter:off 
    from(reportUri) 
     .routeId("monthly-report-route") 
     .log("Audit report processing started...") 
     .to("mybatis:updateProcessControl?statementType=Update") 
     .choice() 
      /* 
      * If the rows updated is 1, this service instance wins and can run the report. 
      * If the rows updated is zero, go to sleep and wait for the next scheduled run. 
      */ 
      .when(header("CamelMyBatisResult").isEqualTo(1)) 
       .process(reportDateProcessor) 
       .to("mybatis:selectReport?statementType=SelectList&consumer.routeEmptyResultSet=true") 
       .process(new ReportProcessor()) 
       .to("smtp://smtpin.tilg.com?to=" 
         + emailToAddr 
         + "&from=" + emailFromAddr) 
       .id("RecipientList_ReportEmail") 
     .endChoice() 
    .end(); 
    // @formatter:on 
} 

Когда я пытаюсь запустить тест на это он дает мне ошибку о том, верблюд не может автоматически создать компонент mybatis , Я неопытен с проверкой верблюжьих маршрутов, поэтому я не совсем уверен, куда идти с этим. Первый вызов mybatis обновляет строку в таблице, которая не тестируется, поэтому я хотел бы сделать что-то вроде, когда удаляется конечная точка, возвращает заголовок CamelMyBatisResult со значением 1. Вторая конечная точка mybatis должна возвращать хэш-карту (пустой для первого теста, заполненный для второго). Как мне приступить к реализации механизма «когда-то» или «с помощью верблюда»? Я посмотрел на макетные документы верблюжьей верблюжии, но я не могу понять, как применить это, и вернуть ему значение в обмен, а затем продолжить маршрут (конечным результатом теста является проверка того, что письмо с или без вложения направляется)

EDIT: пытался использовать как заменить() набор * метода и замена mybatis конечных точек с вызовом встраивать процессоры:.

@Test 
public void test_reportRoute_NoResultsFound_EmailSent() throws Exception { 
    List<AuditLog> bodyList = new ArrayList<>(); 
    context.getRouteDefinition("monthly-report-route").adviceWith(context, 
      new AdviceWithRouteBuilder() { 
       @Override 
       public void configure() throws Exception { 
        replaceFromWith(TEST); 
        weaveById("updateProcControl").replace() 
         .process(new Processor() { 
          @Override 
          public void process(Exchange exchange) throws Exception { 
           exchange.getIn().setHeader("CamelMyBatisResult", 1); 
          } 
         }); 
        weaveById("selectReport").replace() 
         .process(new Processor() { 
          @Override 
          public void process(Exchange exchange) throws Exception { 
           exchange.getIn().setBody(bodyList); 
          } 
         }); 
        weaveById("RecipientList_reportEmail").replace() 
         .to("smtp://localhost:8083" 
           +"?to=" + "[email protected]" 
           +"&from=" + "[email protected]"); 
       } 
    }); 
    ProducerTemplate prod = context.createProducerTemplate(); 
    prod.send(TEST, exch); 

    assertThat(exch.getIn().getHeader("CamelMyBatisResult"), is(1)); 
    assertThat(exch.getIn().getBody(), is("")); 
} 

до сих пор, заголовок по-прежнему нулевой , как и тело (переменная TEST является прямым компонентом)

+0

Можете ли вы отправить сообщение об ошибке вы получаете? трассировки стека? –

+0

Авто создавать вещи на самом деле не проблема; Я хочу издеваться над этими конечными точками и возвращать ответ, так как его не те конечные точки, которые непосредственно тестируются, поэтому им не очень важно получить созданный компонент mybatis. – jbailie1991

+0

В этом случае установите .id() для каждого .to (), а затем вы перехватите, замените. и установить значения жестко настроенного ответа. См. Рекомендацию для тестирования .. http://camel.apache.org/advicewith.html –

ответ

5

Если вы хотите вставить жестко запрограммированные ответы, вам будет проще сделать советНа вашем маршруте s. См. Здесь: http://camel.apache.org/advicewith.html

В принципе, добавьте идентификатор к каждой конечной точке или .to(). Затем ваш тест выполнит рекомендацию, а затем замените это .to() некорректным кодом. Это может быть карта, строка или что-то еще, что вы хотите, и оно будет заменено. Например:

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // weave the node in the route which has id = bar 
     // and replace it with the following route path 
     weaveById("bar").replace().multicast().to("mock:a").to("mock:b"); 
    } 
}); 

Примечание, говорится в документации, что вам нужно переопределить метод isAdviceWith и запускать и останавливать camelContext вручную.

Сообщите нам, если у вас возникнут проблемы с ним. Это может быть немного сложно начать, но как только вы получите это, на самом деле это очень мощно, чтобы издеваться над ответами.

Вот пример, который добавляет тело к простому выражению, когда вы делаете adviceWith ..

context.getRouteDefinition("yourRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
    weaveById("yourEndpointId").replace().setBody(new ConstantExpression("whateveryouwant" 
    )); 
    } 

}); 
+0

, поэтому я некоторое время пытаюсь это сделать, заголовок не устанавливается, который пропускает остальную часть маршрута, или, по крайней мере, каждый раз, когда я проверяю обмен в утверждении для заголовок возвращается как null, обновит вопрос с помощью теста – jbailie1991

+0

Когда вы упомянули с помощью setBody, чтобы вставить hashmap, как бы это сделать из выражения?метод принимает аргумент выражения, и я не могу найти какие-либо ресурсы о том, как просто вставить переменную, созданную до вызова setBody – jbailie1991

+0

@ jbailie1991, я отредактировал свой ответ на примере. –

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