【问题标题】:Testing with Apache Camel AdviceWith and weaveById使用 Apache Camel AdviceWith 和 weaveById 进行测试
【发布时间】:2017-06-19 16:18:57
【问题描述】:

我目前正在尝试使用 Apache Camel 测试现有路由,但我不确定自己是否正确,因为我不完全理解 Camel 背后的所有概念。

话虽如此,这就是我想做的,在以下示例路线上:

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);
    }

}

我已经阅读了一些关于 AdviceWithWeaveById 的内容,我想测试两条路由之间的交换状态。

这是我对处理器测试的尝试:

@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();
    }

}

最后一件事:我正在使用 Camel 2.18.0。

如何测试每条路由之间的交换状态? 我错过了什么?

编辑:刚刚编辑了测试类的代码(编译和工作)但我得到以下断言错误:

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

这又增加了一个问题:为什么没有正确捕获消息?

感谢您的帮助。

【问题讨论】:

    标签: java dependency-injection apache-camel


    【解决方案1】:

    您是否向您的 testroute 发送任何消息?我在代码中看不到这一点。例如

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

    【讨论】:

    • 就是这样!愚蠢的错误,但正如我所说,我不是骆驼专家。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多