2017-07-21 10 views
0

キャメル初心者で、MockEndpoints機能の仕組みを理解するためにいくつかのコードを試していますが、機能しません。ここで私がMockEndpointsを使って単体テストしたい私のCamelルートがあります。プロパティ値は、application.propertiesファイルで定義されています。キャメルユニットテストMockEndPointsとスキップ

from("kafka:{{kafka.servers}}?topic={{kafka.consumer.topic}}&groupId={{kafka.consumer.groupId}}") 
    .to("direct:notify"); 

from("direct:notify") 
    .log("direct:notfy"); 

ここに私のテストコードは、1 Exchangeの受信のアサートに失敗しています。あなたはそれが正規表現であることを期待場合

@RunWith(SpringRunner.class) 
@SpringBootTest 
@MockEndpointsAndSkip("kafka:{{kafka.servers}}?*|direct:notify") 
public class NotificationApplicationTests {  

    @Autowired 
    private CamelContext context; 

    @Value("${kafka.servers}") 
    private String kafkaServers; 

    @EndpointInject(uri="mock:kafka:{{kafka.servers}}") 
    private MockEndpoint mockKafka; 

    @EndpointInject(uri="mock:direct:notify") 
    private MockEndpoint mockDirect; 

    @Autowired 
    private ProducerTemplate notiProducer; 

    @Test 
    public void testMockEndpoints() throws Exception{          

     mockDirect.setExpectedMessageCount(1); 
     mockDirect.whenAnyExchangeReceived((Exchange exchange) -> { 
      //NEVER GETS HERE!! 
      log.info("MOCK DIRECT exchange received");   
     });  

     String payload = "{'email': '[email protected]', 'data': 'ABC1234'}"; 

     notiProducer.sendBody(mockKafka, payload); 

     mockDirect.assertIsSatisfied(); 

    } 

} 

答えて

0

あなたのモックエンドポイントが間違っている:プロデューサーは決して私のカフカMockendpointにメッセージを送信されていないことが表示されます。

@MockEndpointsAndSkip("kafka:{{kafka.servers}}?*|direct:notify") 

正規表現で*を使用してください。ワイルドカードではないため、通常0.30文字に一致させるには.*を使用する必要があります。正規表現でもう少し調べてみてください。正規表現テスターを使ってオンラインで見つけたり、Javaエディタでプラグインとしてインストールしたりできます。

また、kafkaで始まるルートを置き換えたい場合は、@MockEndpointsAndSkipは開始用ではないため、別の処理を行う必要があります。しかし、送信する。アドバイステストのセクション:http://camel.apache.org/advicewith.htmlについてはreplaceFromを参照してください。

私の本「Camel in Action」第2版では、素晴らしいCamelのマニュアルをお探しの場合は、https://www.manning.com/books/camel-in-action-second-editionというテストの章全体でさらに多くのドキュメントがあります。

+0

ありがとうございます。提案された変更の後に機能しました。 「直接通知する」エンドポイントをモックして私の最初のルート(モックで:直接:通知)から交換を受け取ったとき、2番目のルートはキックオフされません。それは?私はログに "direct:notify"と期待していましたが、2番目のルートは決して蹴られません。 – vikram

+0

..AndSkipを使うので、そのエンドポイントに送信をスキップします。 AndSkipを使わないものも使ってください。 –

+0

私の理解では、MockEndpointAndSkipは "mock:direct:notify"エンドポイントを追加し、元のエンドポイント "direct:notify"への送信をスキップしますが、代わりに "mock:direct:notify"に交換を送信します。 "direct:notify"で始まる私の2番目のルートは "mock:direct:notify"を追加し、私の最初のルートからこの模擬エンドポイントで受信した交換機は、第二のルートで? – vikram

関連する問題