2011-12-20 128 views
16

我有一系列「流水線」組件,都通過ActiveMQ消息隊列進行通信。每個組件使用Camel將這些隊列中的每一個作爲端點處理。每個組件使用相同的基本模式:使用MockEndpoints測試駱駝

Basic component pattern

其中每個組件使用消息關的輸入隊列的,處理該消息(一個或多個),然後放置1 +上的出站/輸出隊列中的消息。 「輸出」隊列然後成爲鏈中下一個組件的「輸入」隊列。很基本。

我現在試圖捲起袖子,並使用Camel的測試API提供的MockEndpoints爲每個組件提供單元測試。我一直在瀏覽駱駝網站上的javadoc和幾個例子,但是難以連接所有的點。

在我看來,對於每個部件,我的單元測試的一部分將要完成以下三件事情:

  • 測試,看看是否有正在等待一個特定消息的「輸入「隊列
  • 拉下這些消息並處理它們
  • 推送新郵件到‘輸出’的隊列,並驗證他們把它存在

是lieve我需要爲每個隊列創建MockEndpoints像這樣:

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

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

所以現在,在我的JUnit測試方法,我可以設置期望,並與這些端點進行交互:

@Test 
public final void processMethodShouldSendToOutputQueue() 
{ 
    Component comp = new Component(); 
    comp.process(); 

    outputQueue.assertIsSatisfied(); 
} 

我只是不理解如何連接一切正常:

  • 如何連接compinputQueueoutputQueue個MockEndpoints?
  • 對於每個MockEndpoint,我如何設置期望以便assertIsSatisfied()檢查消息是否存在於特定隊列中,或者特定隊列是否包含消息?
+0

的http://計算器。 com/questions/5664331/how-to-unit-test-production-routes-in-apache-camel – 2011-12-20 19:53:45

回答

11

亞當,有幾種方法可以做到這一點。

對於POJO組件,blackbox將它們與任何Camel環境/路由分開進行測試,以專注於業務邏輯。

如果您想對路由進行端到端測試,請考慮使用以下方法之一來驗證路由中的每個步驟都已滿足。

  • 使用NotifyBuilder建立交易所驗證表達式(有點複雜,讓你的頭部周圍)
  • 使用AdviceWith其運行之前,動態改變路線(添加日誌/模擬終端等)

我更喜歡AdviceWith,因爲它非常靈活並且利用了熟悉的MockEndpoints。對於這個完整的示例,請參見this unit test

總之,你將創建一個單元測試注入MockEndpoints到您的路線,然後驗證對他們像往常一樣...

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // mock all endpoints 
     mockEndpoints(); 
    } 
}); 

getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); 

template.sendBody("direct:start", "Hello World"); 
+0

我很欣賞今天的答案 - 是的,我將單獨測試組件(及其「過程」方法)。然而,作爲組件和它們的輸入/輸出隊列之間的一種「集成測試」的一部分,我確實希望自動化移動定義明確的路由的消息的確定。 AdviceWith API看起來很有趣,我會檢查一下。但它的存在似乎無效了對MockEndpoint的需求。你能澄清什麼時候適合使用它們嗎?並再次感謝! – IAmYourFaja 2011-12-20 20:11:45

+0

亞當,真正的端到端測試,使用AdviceWith動態地將MockEndpoints注入到現有生產路線中。模擬非常強大,因爲提供了統計信息/斷言API,但不應直接添加到生產路線。我會通過一個例子來更新我的答案...... – 2011-12-21 05:43:03

+0

@boday,你能否告訴我如何向路由發送一個'Exchange'的例子?我問,因爲我不清楚你可以如何發送一個'交換'到路由的'from'。提前致謝。 – danidemi 2016-01-11 16:13:55