4

DI には Spring を使用し、ルーティング/メッセージングには Camel を使用しています。さまざまなコンポーネント (パイプライン方式でメッセージを相互にルーティングするコンポーネント) の (JUnit) ユニット テストをセットアップするように依頼されました。

一般的なCamel のテストドキュメントとCamel-Spring のテストドキュメントをざっと見てみると、キャメル エンドポイントを単体テストする好ましい方法は、Spring Test Context Frameworkを使用して、 および sort のようなオブジェクトのサブクラスを使用することAbstractJUnit38SpringContextTestsです。

これらの API の使用経験はまったくありません。したがって、それらは興味深い読み物になりますが、それらを文脈に入れるのは難しいです (しゃれは意図されていません)。

そのため、私が苦労しているいくつかの初期概念があります。

MockEndpoint1 つには、 、 vs DataSet、 vsを使用するのが適切なのはいつTestですか?

また、Camel-Spring doc (リンクは上にあります) には、次の例が示されています。

@ContextConfiguration
public class MyCamelTest extends AbstractJUnit38SpringContextTests {

    @Autowired
    protected CamelContext camelContext;

    @EndpointInject(uri = "mock:foo")
    protected MockEndpoint foo;

    public void testMocksAreValid() throws Exception {

        // lets add more expectations...
        MockEndpoint.assertIsSatisfied(camelContext);

        // now lets do some further assertions
        List<Exchange> list = foo.getReceivedExchanges();

        for (Exchange exchange : list) {
            Message in = exchange.getIn();
            ...
        }       
    }
}

私がこの API を理解し始めMockEndpointたとしても、上記のコードは名前付きからすべてのメッセージを読み取っているようにmock:foo見えますが、それらのメッセージがどこから来ているのか (どのようにしてエンドポイントに到達するのか) はわかりません。最初の場所)!

私の 2 番目の質問は、「スタブ」(モック) するエンドポイントを決定するための標準的な方法は何ですか? たとえば、同じ JMS メッセージ キューが、2 つの異なる JAR/WAR 内に存在する 2 つのエンドポイント (1 つはプロデューサー、もう 1 つはコンシューマー) で使用されている場合はどうなるでしょうか? この場合、ProducerComponent(内にあるproducer.war) はメッセージを にプッシュする Camel エンドポイントですsomeQueue。そしてConsumerComponent( の中に住んでいるconsumer.war) は、 からメッセージを消費する別の Camel エンドポイントですsomeQueue

SO は、両方のコンポーネントの単体テストをどのように編成しますか?

正しい方向への微調整をよろしくお願いします!

4

2 に答える 2

6

ルートを徹底的にテストする優れた方法。あなたが言及したCamelテストとSpringテストのリソースは、おそらく最良の出発点です. ここで、テストに Spring を使用するかどうかは、ルートの設定方法、つまり Spring XML DSL を使用するか Java DSL を使用するかによっても異なります。明らかに、CamelSpringTestSupport (または AbstractJUnit38SpringContextTests でさえも) は前者に適している可能性があり、後者の場合は CamelTestSupport のみを好む場合があります。今あなたの質問に:

  1. MockEndpoint、DataSet、または Test を使用するのが適切なのはいつですか? 実際には「対」ではありません。これらはすべて異なる役割を果たし、必要に応じて一緒に使用します。テストは Camel 固有のものではなく、通常の JUnit テストです。Camel は、テストを簡素化するためのいくつかの特殊化とユーティリティを提供します (CamelTestSupport など)。一般的に (常にではありません)、Camel によって定義された強力な EIP (エンタープライズ統合パターン) と無数のプロトコルとデータ形式のサポートを利用して、軽量のビジネス プロセスやワークフローのようなシステム統合に Camel を使用します。テスト中に何らかのエンドポイントにメッセージを送信することがありますが、処理が正しく、受信したメッセージが期待どおりのものであることを確認するにはどうすればよいでしょうか? その目的のために、Camel は MockEndpoint を提供しました。ターゲット エンドポイントの代わりに使用できる (テスト中に使用する必要がある)。そうすれば、アサーションを使用して、受信したメッセージが期待どおりのものであり、正しい順序、タイミングなどであることが保証されます。プロパティ コンポーネントを使用して、さまざまなテスト (または運用) 環境でエンドポイントを簡単に置き換えることができます。DataSet は、一連のメッセージを送信または検証するための便利な方法です。

  2. 「スタブ」するエンドポイントを決定するための標準的な方法は何ですか? 通常は、メッセージ形式と事前条件と事後条件に同意することでうまくいきます。つまり、プロデューサーがコンシューマーとは無関係に目的のメッセージを生成することをテストでき、同じプロトコルを使用する必要さえありません (送信することができます)。上記のように、たとえば MockEndpoint へのメッセージ)。これにより、プロデューサーが正しいことを行っているという確信が得られます。同様に、コンシューマーを個別にテストすることもできます。うまくいかない場合は、テストに何かが欠けている可能性があります。ほとんどの場合、すべてを単体テストできるわけではありません。本番環境により近い統合テストを行うことをお勧めします。

より具体的なご質問をいただければ、より具体的なアドバイスを差し上げることができます。これが役立つことを願っています。

于 2011-12-20T01:53:50.150 に答える
3

Camel ブックのテストの章は非常に優れています。CamelTestSupport を拡張するだけで、ルートへのダミーの入力または出力としてモックを使用します (Spring や注入などについては心配しません)。障害などをシミュレートするために、ルート上のコンポーネント間に物 (名前は忘れました) を配置することで実行できる、風変わりなものもたくさんあります。上記の本を強くお勧めします。非常に明確で正確です。

2 番目の質問については、メッセージの作成方法によって異なると思います。モック エンドポイントを使用して、キューからのフィードまたは消費 (またはその両方) を行うことができます。モック エンドポイントには、メッセージをチェックするための優れたサポートが多数あります。

CamelTestSupport とそのスーパークラスには、メッセージを作成するための便利なメソッドがたくさんあります。

于 2011-12-19T17:23:03.883 に答える