2011-08-10 34 views
1

如何用模擬替換重量級輸入終端並向其發送消息?駱駝 - 將消息發送到模擬輸入

說我有以下路線。

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

換句話說,一個春天的web服務,完成整個lotta處理。

測試此路線的一種方法是在網絡服務器中啓動web服務併發送消息,但這比我想要的要多得多。

相反,我預計,如果我mock all of my endpoints,我應該能夠做到這一點:

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的理解是否正確?如果有,還有其他方法可以實現嗎?我真的很想避免實際啓動web服務來測試這些路由。

謝謝大家。

編輯 - 它看起來像我可以使用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)... 

另一種選擇是站在單元測試中的web服務,並使用HTTP客戶端API來模擬對真實路由的請求。見camel-spring-ws examples

最後,如果你真的需要更換一個端點的測試,然後使用properties覆蓋端點定義或adviceWithintercept策略,讓您有更多的靈活性(雖然可以先混淆)..

+0

謝謝boday,我最終做到了前者,將服務分開並使用direct。驚訝的是,發送到模擬不會做伎倆,雖然.. –

+0

很酷...起初模擬有點混亂,認爲它作爲目標端點轉儲消息來驗證 –

1

在Apache Camel 2.9中,advice中有一個新的replaceFrom方法,它允許您在單元測試之前用其他端點替換消費者。例如,您可以用直接端點替換spring-ws。然後在單元測試中發送消息給該直接端點。與本文在他的回答中提到的相同。詳情請見:http://camel.apache.org/advicewith.html

+0

謝謝克勞斯,好消息。感謝那裏的辛勤工作! –

+0

順便說一句我剛剛重新命名的方法replaceFromWith,以更好地表明其替換端點*與其他*。 –

+0

如果您重寫isUseAdviceWith()方法並返回true,那麼您不需要在類路徑上使用camel-spring-ws,因爲Camel在通知代碼之前未啓動。我在上面的鏈接中添加了關於此的詳細信息。 –