2011-08-10 9 views
1

重量のある入力エンドポイントを模擬したものに置き換えてメッセージを送信するにはどうすればよいですか?Camel - 模擬入力へのメッセージの送信

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

from("spring-ws:rootqname:{http://myNameSpace}SomeRequest?endpointMapping=#endpointMapping"). 
    processor(new VeryComplicatedProcessor()). 
    to(etc). 
    to(etc)... 

つまり、完全にロッタ処理を行うスプリングWebサービスです。

このルートをテストする1つの方法は、WebサーバーでWebサービスを起動してメッセージを送信することですが、それは発生させたいオーバーヘッドよりもはるかにオーバーヘッドです。

public class RouteTest extends CamelSpringTestSupport { 

    @Override 
    public String isMockEndpoints() { 
     return "*"; // mock everything 
    } 

    @Test 
    public void simpleDirectTest() throws Exception { 

     String realURI = "spring-ws:rootqname:{http://myNameSpace}SomeRequest?endpointMapping=#endpointMapping"; 
     String mockedURI = "mock:" + realURI; 
     String msg = buildSomeSoapMsg(); 

     Object out = template.requestBody(mockedURI, msg); 
     log.debug(out.toString()); 
    } 
... 
} 

を...と、全ルートの実行を持っていると私に応答を返す:

代わりに、私は私mock all of my endpoints場合、私はこれを行うことができる必要があることを期待したいです。代わりに、私はちょうど私にメッセージを送って戻ってきて、ルートは走っていません。

モックに関する私の理解は間違っていますか?もしそうなら、これを達成する別の方法がありますか?私は実際にこれらのルートをテストするためにWebサービスを実際に起動する必要はありません。

ありがとうございます。

EDIT - この問題を解決するためにAdviceWithを使用すると分かりましたが、AdviceWithは上記のように入力ではなく出力でのみ機能するようです。

答えて

1

いくつかのオプションがあります。(VeryComplicatedProcessorがオンになっている)残りのルートをテストしようとしている場合は、ルートを分割して直接などでテストできます。

from("spring-ws:rootqname: {http://myNameSpace}SomeRequest?endpointMapping=#endpointMapping"). 
.to("direct:processRequest"); 

from("direct:processRequest"). 
processor(new VeryComplicatedProcessor()). 
to(etc). 
to(etc)... 

もう1つの選択肢は、単体テストでWebサービスをスタンドアップし、HTTPクライアントAPIを使用して実際のルートへの要求をシミュレートすることです。あなたが本当にあなたに(最初は混乱することができますが)さらに多くの柔軟性を提供するエンドポイント定義またはadviceWithまたはintercept戦略を上書きするpropertiesを使用し、その後、テスト用のエンドポイントを交換する必要がある場合、最後にcamel-spring-ws examples

を参照してください。..

+0

ありがとうございました。私は結局前者をやって、サービスを分割してダイレクトを使用しました。 –

+0

クール...最初はちょっと混乱していますが、メッセージをダンプする宛先エンドポイントと考えています –

1

Apache Camel 2.9では、adviceの中に新しいreplaceFromメソッドがあります。このメソッドを使用すると、単体テスト前にコンシューマを他のエンドポイントに置き換えることができます。たとえば、spring-wsを直接エンドポイントに置き換えることができます。そして、ユニットテストでその直接エンドポイントにメッセージを送信します。ベンが彼の答えで掲示したのと同じ行に。詳細は以下を参照してください:http://camel.apache.org/advicewith.html

+0

ありがとうクラウス、良いニュース。そこのすべてのハードワークをありがとう! –

+0

btw私は、メソッドをreplaceFromWithにリネームして、from endpoint *を何か他のものに置き換えることをより明確に示すようにしました。 –

+0

そして、isUseAdviceWith()メソッドをオーバーライドしてtrueを返すと、Camelがアドバイスコードの前に起動されていないので、クラスパスにcamel-spring-wsは必要ありません。上記のリンクにこれに関する詳細を追加しました。 –

関連する問題