1

私のサービスには次のルートがあります。

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 呼び出しはテーブル内の行を更新しますが、これはテスト中ではないので、エンドポイントがヒットしたときのようなことをしたいのですが、値 1 の CamelMyBatisResult ヘッダーを返します。2 番目の mybatis エンドポイントは hashmap(最初のテストでは空、2 番目のテストでは入力済み)。キャメル テストで when/then のようなメカニズムを実装するにはどうすればよいですか? 私は模擬エンドポイントのラクダのドキュメントを見てきましたが、それを適用して交換に値を返す方法がわかりません。その後、ルートを続行します(テストの最終結果は、または添付ファイルなしで送信されます)

編集: replace().set* メソッドの両方を使用して、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=" + "test@test.com"
                                +"&from=" + "test1@test1.com");
                }
    });
    ProducerTemplate prod = context.createProducerTemplate();
    prod.send(TEST, exch);

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

これまでのところ、本文と同様に、ヘッダーはまだ null です (TEST 変数は直接コンポーネントです)。

4

1 に答える 1

5

ハードコーディングされた応答を入れたい場合は、ルートで adviceWith を実行する方が簡単です。ここを参照してください: http://camel.apache.org/advicewith.html

基本的に、各エンドポイントまたはに id を追加します.to()。次に、テストで adviceWith を実行し、その .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"
     ));
  }

});
于 2016-11-17T14:45:36.913 に答える