2013-04-04 106 views
0

我想設置一個駱駝路線的測試。我的測試路由讀取一個二進制文件並將其發送給一個翻譯器bean,返回一個POJO。現在,我想對POJO做一些斷言,以確保那些值與已知值相匹配。標準的東西,我認爲。在我見過的例子中,主體似乎總是一個String或原始類型,並且可以在其上完成一個簡單的斷言。但是,就我而言,它是一個對象,所以我想以某種方式獲取對象。正確的方法來測試我的對象在駱駝

這裏是我試過到目前爲止:

@Override 
protected RouteBuilder createRouteBuilder() throws Exception { 
    return new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      from("file:///path/to/dir/of/test/file/?noop=true") 
      .bean(TranslatorBean.class) 
      .to("mock:test").end(); 
     } 
    }; 
} 

@Test 
public void testReadMessage() throws Exception { 

    MockEndpoint endpoint = getMockEndpoint("mock:test"); 

    endpoint.whenAnyExchangeReceived(new Processor() {  
     @Override 
     public void process(Exchange exchange) throws Exception {   
      Object body = exchange.getIn().getBody(); 

      assertIsInstanceOf(MyPOJO.class, body); 

      MyPOJO message = (MyPOJO) body; 

      assertEquals("Some Field", someValue, message.getSomeField()); 

      // etc., etc. 

     }   
    }); 


    //If I don't put some sleep here it ends before anything happens 
    Thread.sleep(2000); 

} 

當我運行它,它看來,它運行正常,但是當我單步執行,我可以看到一個斷言失敗。出於某種原因,這不會被報告。

於是我嘗試了我的內聯處理器的路線,像這樣:

public void configure() throws Exception { 
    .from("file:///path/to/dir/of/test/file/?noop=true") 
    .bean(TranslatorBean.class) 
    .process(new Processor() { 
     //same code as before 
    }); 
} 

這類作品,但有一個巨大的問題。任何失敗的斷言仍然不會被JUnit報告。相反,它們被Camel捕獲,並報告爲CamelExecutionException,但完全沒有關於原因的信息。只有通過遍歷調試器才能確定哪個斷言失敗。另外,這樣我的整個測試都在配置方法中,而不是在它自己的測試方法中。我必須包含一個帶有睡眠的空測試來讓它運行。顯然這很糟糕,但我確信這裏要做的是正確的事情。它看起來像一個處理器可能不是正確的路線,但我沒有看到正確的方式。任何指導非常感謝。

回答

0

我建議從Apache Camel文檔開始閱讀。在用戶指南:http://camel.apache.org/user-guide.html有一個鏈接到測試:http://camel.apache.org/testing.html它有很多的信息。此外,由於您使用模擬終端閱讀,以及:http://camel.apache.org/mock

例如,你有模擬代碼可以做到

MockEndpoint endpoint = getMockEndpoint("mock:test"); 
mock.allMessages().body().isInstanceOf(MyPojo.class) 

雖然人們經常使用的一個模擬終端等 的exepected方法。例如,如果您期望2條消息,並且它們的機構按以下順序排列:

MockEndpoint mock = getMockEndpoint("mock:result"); 
mock.expectedBodiesReceived("Hello World", "Bye World"); 

但請查看模擬和測試文檔以瞭解更多信息。

如果你有駱駝行動書的副本,那麼請閱讀第6章,關於駱駝測試的全部內容。

+1

你好,克勞斯,非常感謝你的迴應。我讀了很多關於你的書(我真的認爲這本書是我學習新技術時讀過的最好的書之一),以及在線文檔。測試身體的例子似乎都像你剛剛給出的「Hello World」,「Bye World」的例子,身體只是一個字符串,所以對身體的期望/斷言是有意義的。然而,我的消息體是一個對象,我需要做更多的參與測試。沒有辦法獲得信息的正文並測試一些字段嗎? Tusind tak! – Denial 2013-04-07 15:09:47

3

如果你正在尋找一種方式來檢索對象本身,並在其上執行斷言,你想要的東西,如:

Product resultProduct = resultEndpoint.getExchanges().get(0).getIn().getBody(Product.class); 
assertEquals(expectedEANCode, resultProduct.getEANCode()); 

哪裏resultEndPoint是模擬端點。