8

RESTful エンドポイントからのメッセージを消費し、AMQP エンドポイントに送信するために、Apache Camel で メッセージ トランスレータ パターンを実装しています。

含まれているアプリケーションは Spring Boot に基づいているため、Camel の「spring-boot」コンポーネントを使用して 2 つのフレームワークを統合しています。この spring-boot リンクのドキュメントで示唆されているように、@Configuration拡張する注釈付きクラス内に Camel ルートを実装していRouteBuilderます。

@Component
public class MyRestToAmqpRouter extends RouteBuilder {

   @Override
   public void configure() throws Exception {

      from("jetty:http://my-restful-url")
         .process(exchange -> {
            // convert the message body from JSON to XML, take some 
            // incoming header values and put them in the outgoing
            // body, etc...
         }).to("rabbitmq://my-rabbitmq-url");

   }

}

私の質問は、実際の RESTful エンドポイントや構成済みの RabbitMQ ブローカーを必要とせずに、この翻訳の単体テストを行う方法に関するものですか? 多くのオンラインの例とCamel in Actionの本を読みました...そして、Camel ルートを単体テストするための典型的なアプローチは、ルートを単体テストにカットアンドペーストし、1 つまたはより多くのエンドポイント URL は " mock:whatever" で表されます。

たぶんうまくいくと思います...しかし、それは非常に脆弱であり、単体テストを更新せずに後で誰かが実際のコードを変更した場合、テストスイートは認識しません。

次のように、いくつかの Spring ベースの単体テストの例をモックに適応させようとしました。

@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class})
public class MyRestToAmqpRouterTest extends AbstractJUnit4SpringContextTests {

    @Produce(uri = "jetty:http://my-restful-url")
    private ProducerTemplate fakeRest;

    @EndpointInject(uri = "rabbitmq://my-rabbit-url")
    private MockEndpoint fakeRabbit;

    @Test
    @DirtiesContext
    public void testRouter() throws InterruptedException {
        fakeRabbit.expectedMessageCount(1);
        fakeRest.sendBodyAndHeader("", "header-1", "some value");
        fakeRabbit.assertIsSatisfied();
    }

}

私の希望は、Camel が単体テストからこれらのエンドポイント URL を取得し、それらをモックとして登録し、実際のコードがそれらの URL を使用しようとしたときに、実際のエンドポイントではなくモックを使用することでした。

ただし、これが可能かどうかはわかりません。単体テストで実際の URL を使用するとIllegalArgumentException、「実際の」エンドポイント URL をインスタンスに挿入できないようですMockEndpoint(" " で始まる URL のみmock:)。

mock:...単体テストで" " エンドポイント URL を使用しても、テスト対象のクラスの実際のエンドポイント URL に関連付けるものがないため、役に立ちません。そのため、実際のエンドポイント URL は決してオーバーライドされません。実際のコードが実行されると、通常どおり実際のエンドポイントが使用されます (目標は、RabbitMQ への外部依存なしでテストできるようにすることです)。

ここで本当に基本的なレベルで何かが欠けていますか? 単体テストがこのようなクラスに偽のルートを挿入する方法があるように思われるため、テスト中のコードは実際のエンドポイントからモックエンドポイントに気付かずに切り替えることができます. あるいは、コードをリファクタリングして、匿名Processorクラスをスタンドアロン クラスに昇格させることができると思います...そして、ルートとは別に、その翻訳ロジックを単体テストできます。しかし、それは不完全なテストのように思えます。

4

1 に答える 1

4

あなたができることのいくつかの指針。

テストについてキャメルの本をもう一度読んで、アドバイスを使用することに注意してください。

また、mockEndpointsAndSkip

stubまた、コンポーネントを使用することもできます

または、ルートでプロパティ プレースホルダーを使用してから、URI をテスト用にモック/スタブなどに構成し、実稼働用に実際のものを使用します。

于 2015-04-12T05:02:03.080 に答える