2017-06-19 81 views
1

我目前正在嘗試使用Apache Camel測試現有路由,但我不確定我是否正確地做了這件事,因爲我沒有完全理解Camel背後的所有概念。使用Apache Camel進行測試AdviceWith和weaveById

話雖這麼說,這裏是我想要做的,在下面的例子路線是什麼:

public class TestExampleRoute extends SpringRouteBuilder { 

    /** The Constant ENDPOINT_EDOSSIER_IMPORT. direct:edossierImport */ 
    public static final String ENDPOINT_EXAMPLE = "direct:testExampleEndpoint"; 

    @Override 
    public void configure() throws Exception { 
     // @formatter:off 
     from(ENDPOINT_EXAMPLE).routeId("testExample") 

      .bean(TestExampleProcessor.class, "getImportDocumentProcess").id("getImportDocumentProcess") 
      .bean(TestExampleProcessor.class, "createImportDocumentTraitement").id("createImportDocumentTraitement") 

      .to(BaseEndpoint.LOG_MESSAGE_SHOW_ALL_MULTILINE); 
     // @formatter:on 
    } 

} 

這裏的關鍵是隻是爲了獲取一個ImportDocumentProcess並創建一個ImportDocumentTraitement取決於上一個對象。 ImportDocumentProcess通過交換。

這裏是處理器代碼:

@Component("testExampleProcessor") 
public class TestExampleProcessor { 

    /** The Constant LOGGER. */ 
    private static final Logger LOGGER = LogManager.getLogger(TestExampleProcessor.class); 

    @Autowired 
    ImportDocumentTraitementService importDocumentTraitementService; 

    @Autowired 
    ImportDocumentProcessDAO importDocumentProcessDAO; 

    @Autowired 
    ImportDocumentTraitementDAO importDocumentTraitementDAO; 

    // ---- Constants to name camel headers and bodies 
    private static final String HEADER_ENTREPRISE = "entreprise"; 
    private static final String HEADER_UTILISATEUR = "utilisateur"; 
    private static final String HEADER_IMPORTDOCPROCESS = "importDocumentProcess"; 

    public void getImportDocumentProcess(@Header(HEADER_ENTREPRISE) Entreprise entreprise, Exchange exchange) { 
     LOGGER.info("Entering TestExampleProcessor method : getImportDocumentProcess"); 

     Utilisateur utilisateur = SessionUtils.getUtilisateur(); 
     ImportDocumentProcess importDocumentProcess = importDocumentProcessDAO.getImportDocumentProcessByEntreprise(
       entreprise); 

     exchange.getIn().setHeader(HEADER_UTILISATEUR, utilisateur); 
     exchange.getIn().setHeader(HEADER_IMPORTDOCPROCESS, importDocumentProcess); 
    } 

    public void createImportDocumentTraitement(@Header(HEADER_ENTREPRISE) Entreprise entreprise, 
      @Header(HEADER_UTILISATEUR) Utilisateur utilisateur, 
      @Header(HEADER_IMPORTDOCPROCESS) ImportDocumentProcess importDocumentProcess, Exchange exchange) { 
     LOGGER.info("Entering TestExampleProcessor method : createImportDocumentTraitement"); 

     long nbImportTraitementBefore = this.importDocumentTraitementDAO.countNumberOfImportDocumentTraitement(); 
     ImportDocumentTraitement importDocumentTraitement = this.importDocumentTraitementService.createImportDocumentTraitement(
       entreprise, utilisateur, importDocumentProcess, "md5_fichier_example_test", "fichier_example_test.xml"); 
     long nbImportTraitementAfter = this.importDocumentTraitementDAO.countNumberOfImportDocumentTraitement(); 

     exchange.getIn().setHeader("nbImportTraitementBefore", Long.valueOf(nbImportTraitementBefore)); 
     exchange.getIn().setHeader("nbImportTraitementAfter", Long.valueOf(nbImportTraitementAfter)); 
     exchange.getIn().setHeader("importDocumentTraitement", importDocumentTraitement); 
    } 

} 

我看了一下AdviceWith一些事情WeaveById,我想提出考驗航線的兩片之間的交流狀態。

這裏是我的一個處理器測試的嘗試:

@ContextConfiguration(locations = { "classpath:/camel-context.xml" }) 
public class TestExampleProcessorTest extends CamelTestSupport { 

    @Override 
    protected RouteBuilder createRouteBuilder() { 
     return new TestExampleRoute(); 
    } 

    @Override 
    public boolean isUseAdviceWith() { 
     return true; 
    } 

    @Before 
    public void mockEndPoints() throws Exception { 
     context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 

      @Override 
      public void configure() throws Exception { 
       weaveById("getImportDocumentProcess").replace().multicast().to("mock:catchTestEndpoint"); 
      } 
     }); 
    } 

    @Test 
    public void testAdvised() throws Exception { 
     MockEndpoint mockEndpoint = getMockEndpoint("mock:catchTestEndpoint"); 

     context.start(); 
     mockEndpoint.expectedMessageCount(1); 
     mockEndpoint.assertIsSatisfied(); 
     context.stop(); 
    } 

}

最後一件事:我使用駱駝2.18.0。

我該如何測試每條路由之間的交換狀態? 我錯過了什麼?

編輯:剛纔編輯的測試類的代碼(編譯和作品),但我得到以下斷言錯誤:

java.lang.AssertionError: mock://catchTestEndpoint Received message count. Expected: <1> but was: <0> 

這增加了一個問題:爲什麼沒有抓到消息正確嗎?

感謝您的幫助。

回答

1

您是否向testrute發送了任何消息?我在代碼中看不到。例如

template.sendBody(「direct:testExampleEndpoint」,「Hello World」);

+0

就是這樣!愚蠢的錯誤,但正如我所說,我不是駱駝專家。非常感謝你的幫助 ! – matthieusb

+0

如果有人有興趣,我花時間來添加關於此的文檔條目:https://stackoverflow.com/documentation/apache-camel/10630/integration-testing-on-existing-routes-with-apache-camel-和彈簧 - 的DbUnit#噸= 20170625154427774471 – matthieusb