2017-06-19 41 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