2014-12-02 186 views
1

我最近開始調查Apache駱駝,我有一個問題。 我開始編寫一些測試我的路線,也有很多的例子,其中「爲」路線的一部分作爲阿帕奇駱駝模擬端點

<route id="person-add-route"> 
     <from uri="direct:start"/> 
     <to uri="mock:result"/> 
    </route> 

所以,我寫了一個測試,我在哪裏exepcting有模擬寫:結果作爲最後的結果。

@Test 
@DirtiesContext 
public void testCamel() throws Exception { 
    // Given 
    Object body = "body"; 
    int messageCount = 1; 
    MockEndpoint endpoint = getMockEndpoint("mock:result"); 

    // When 
    template.sendBody("direct:start", body); 

    // Then 
    endpoint.expectedMessageCount(messageCount); 
    endpoint.assertIsSatisfied(); 
} 

這裏的問題:這是很重要的寫模擬:導致如果我想測試我的路線?

+0

不知道你在問什麼......你是問你是否需要在所有路線的末端包含一個模擬終點以測試它們? – mdnghtblue 2014-12-02 16:32:45

+0

我在問 - 我是否需要在生產線中包含「模擬:結果」?如果是的話,這對我來說很困惑,因爲我不明白爲什麼我需要在真實代碼中添加測試功能?有什麼辦法,我可以在我的真實代碼中排除「mock:」指令嗎? 這對我來說不是一個問題,但我希望得到一些更優雅的解決方案。 謝謝, – 2014-12-02 18:17:27

+0

你做錯了,你應該在發送消息之前設置期望值。 1)設置預期2)發送消息3)斷言已滿意 – 2014-12-03 14:29:20

回答

4

您不需要在生產中包含「模擬:結果」,有多種方法可以測試您的路線。一個是在你的駱駝測試實施isMockEndpoints

@Override 
public boolean isMockEndpoints() 
{ 
    return "*"; 
} 

所以,如果您的路線是這樣的:

<route id="person-add-route"> 
    <from uri="direct:start"/> 
    <to uri="direct:result"/> 
</route> 

您可以檢查MockEndpoint這樣的:

MockEndpoint endpoint = getMockEndpoint("mock:direct:result"); 

你也可以請使用AdviceWith在測試時修改您的路線,方法如下:

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception 
    { 
     weaveAddLast().to("mock:result"); 
    } 
}); 

另外,正如克勞斯在他的評論中提到的那樣,確保在將消息發送到路由之前設置您的期望。

+0

謝謝,好方法。 – 2014-12-02 22:08:32

+0

你能推薦一些資源來學習apache駱駝嗎?) – 2014-12-02 22:12:49

+0

嗨,實際上,我試過你的解決方案,它不工作,我收到DirectConsumerNotAvailableException - 終端上沒有消費者可用。 – 2014-12-03 08:36:57