Camel测试:验证SQL存储过程调用中参数填充后的Header值
验证Camel中SQL存储过程模板填充后的实际值方法
以下几种方法可以直接获取并验证模板填充后的实际值:
1. 测试中拦截消息获取填充值
在Camel测试套件里,通过adviceWith修改目标路由,在调用sql-stored:template之前插入自定义处理器,直接从Exchange中提取填充后的模板:
adviceWith(context, "你的路由ID", a -> { a.weaveByToUri("sql-stored:template") .before().process(exchange -> { String filledTemplate = exchange.getIn().getHeader("SQL_STORED_TEMPLATE", String.class); // 这里直接做断言验证 assertEquals("ADRE_API.MIGRATION_STARTET(INTEGER 12)", filledTemplate); }); });
这种方式能精准在存储过程调用前拿到最终值,适合单元测试场景。
2. 开启SQL组件日志调试
把Camel SQL组件的日志级别调到DEBUG或TRACE,组件会自动输出实际执行的存储过程语句。以Logback为例,在配置文件中添加:
<logger name="org.apache.camel.component.sql" level="DEBUG"/>
运行测试或应用后,查看日志就能找到填充后的完整调用语句,快速验证结果。
3. 自定义PrepareStatement策略
通过自定义PrepareStatementStrategy拦截SQL模板的填充过程,把填充后的结果存入Exchange属性,方便后续获取:
SqlComponent sqlComponent = context.getComponent("sql-stored", SqlComponent.class); sqlComponent.setPrepareStatementStrategy(new DefaultPrepareStatementStrategy() { @Override public String prepareStatement(String sql, Map<String, Object> parameters, Exchange exchange) throws SQLException { String filledSql = super.prepareStatement(sql, parameters, exchange); // 把填充后的SQL存入Exchange属性 exchange.setProperty("FILLED_SQL", filledSql); return filledSql; } });
之后在测试或处理器中,通过exchange.getProperty("FILLED_SQL", String.class)获取值并验证。
4. 用Mock端点替代实际调用
在测试中把sql-stored:template替换为Mock端点,捕获发送到该端点的消息并验证Header值:
adviceWith(context, "你的路由ID", a -> { a.replaceFromWith("sql-stored:template", "mock:sql-stored"); }); // 配置Mock端点的预期 MockEndpoint mock = getMockEndpoint("mock:sql-stored"); mock.expectedMessageCount(1); mock.message(0).header("SQL_STORED_TEMPLATE").isEqualTo("ADRE_API.MIGRATION_STARTET(INTEGER 12)"); // 执行测试后验证 assertMockEndpointsSatisfied();
这种方式能隔离外部依赖,专注于模板填充逻辑的验证。
内容的提问来源于stack exchange,提问作者Alessandr
相关产品推荐
相关产品推荐

