2016-11-22 93 views
1

比方說,我有一個這樣的Apache的駱駝航線:Apache的駱駝MockEndpoint嘲笑輸出

from("direct:start") 
    .routeId("aRouteId") 
    .bean(someBusinnessTransformationBean).id("transformationBean") 
    .bean(aPersistenceBean).id("persistenceBean") 
    .to("direct:target"); 

,然後在我的單元測試,我做的是這樣的:

public class RouteTest extends CamelTestSupport { 
    @Override 
    public boolean isDumpRouteCoverage() { return true } 

    @Override 
    public boolean isUsedAdviceWith() { return true } 

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

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

    @Test 
    public void testRoute() throws Exception { 
     context.getRouteDefinition("aRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       weaveById("transformationBean") 
        .replace() 
        .multicast() 
        .to(mockTransformationBean); 

       weaveById("persistenceBean") 
        .replace() 
        .multicast() 
        .to(mockPersistenceBean); 
      } 
     }); 

     context.start(); 

     // Asserts the expectedMessageCount 

     // Send a message with template.sendBody... 

     assertMockEndpointSatisfied(); 
    } 
} 

問題:

我該如何正確地測試這條路線,而不是隻確保messageCount和接收體(在第一個bean上)。

一樣,我怎麼能嘲笑一個MockEndpoint的響應,使用的Mockito單元測試時,我可以這樣做:

when(mockTransformationBean.someHandler(...)).thenReturn(anExpectedObjectForMyUnitTestPropose); 

乾杯,尼古拉斯

+0

爲什麼不直接運行單元測試,然後將交換體與一些預期的體進行比較? –

+0

因爲我找不到用apache camel MockEndpoint攔截bean的交換體的方法。我可以確保接收到的模擬物體,但是接下來,我想確保第一個bean轉換主體並向第二個bean發送不同的主體。 –

+0

您可以在bean攔截之後執行adviceWith和將其發送到模擬端點。然後斷言該信息應該是什麼。 –

回答

1

一些研究,文獻閱讀後等,我想出了這個可接受的解決辦法:

weaveById("transformationBean") 
    .replace() 
    .to(mockTransformationBean) 
    .setBody(constant(<myExpectedMockResponse>)); 

所以後來,我可以做一個斷言,如:

mockPersistenceBean.expectedBodiesReceivedInAnyOrder(
    <myExpectedMockResponse> 
); 

通過這種方式,不僅可以確保bean和端點正在接收正確的主體/標頭,而且還可以確保路線之間的任何轉換正常進行。

因此,可以從單位的角度測試代碼的輸入和輸出,而不是將其與單元測試中不必要的許多其他組件集成在一起。

0

您可以單獨構建交換並調用bean方法;也就是說,不要通過Camel發送它們 - 直接調用bean。這是一個更受控制和有針對性的單元測試。

+0

好的,我明白了。唯一讓我感到困惑的是,我怎樣才能確保所寫的所有駱駝路線都能正確寫入?豆自己已經有單元測試。但是,我以後怎麼才能確保開發者,誰來維護代碼,不會破壞路線,而不會打破豆類? –

+0

那麼你爲什麼不創建一個交換,並在你的單元測試中將交換或交換體發送給bean類,然後進行期望匹配。要測試整個路線,您需要運行路線並模擬外部依賴關係。 –