You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Camel路由单元测试:如何验证路由返回的Body内容(含/不含Mock)

检查Camel路由返回Body的单元测试方法

一、不使用Mock的方式

直接利用ProducerTemplate的requestBody方法同步获取路由处理后的返回结果,随后进行断言验证。

修改后的测试代码如下:

@Test
public void testRouteWithoutMock() throws Exception {
    Map<String,Object> map = new LinkedHashMap<>();        
    map.put("name","your_name"); 
    // 发送请求并获取返回的JSON字符串
    String result = template.requestBody("direct:MyRoute", map, String.class);
    // 定义预期的JSON结果(LinkedHashMap会保留插入顺序)
    String expectedJson = "{\"name\":\"your_name\"}";
    // 断言实际结果与预期一致
    assertEquals(expectedJson, result);
}

如果返回的是复杂业务对象,也可以直接指定目标类型,让Camel自动完成反序列化:

// 假设存在对应的User类
User resultUser = template.requestBody("direct:MyRoute", map, User.class);
assertEquals("your_name", resultUser.getName());

二、使用Mock的方式

通过Mock端点捕获路由输出,再利用MockEndpoint提供的断言方法验证结果。这种方式无需修改原路由代码,适合复杂场景下的验证。

1. 动态修改路由(AdviceWith)

在测试的setUp方法中,通过AdviceWith给目标路由末尾添加Mock端点:

@Override
protected void setUp() throws Exception {
    super.setUp();
    // 对ID为MyRoute的路由进行动态修改
    context.getRouteDefinition("MyRoute").adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            // 在路由最后追加Mock端点
            weaveAddLast().to("mock:result");
        }
    });
}

2. 编写断言逻辑

@Test
public void testRouteWithMock() throws Exception {
    Map<String,Object> map = new LinkedHashMap<>();        
    map.put("name","your_name"); 

    // 获取Mock端点实例
    MockEndpoint mockResult = getMockEndpoint("mock:result");
    // 设置预期接收的消息数量
    mockResult.expectedMessageCount(1);
    // 设置预期的Body内容
    mockResult.expectedBodiesReceived("{\"name\":\"your_name\"}");

    // 发送测试消息
    template.sendBody("direct:MyRoute", map);

    // 验证Mock端点是否满足预期
    mockResult.assertIsSatisfied();
}

进阶提示

如果担心JSON格式差异(比如空格、字段顺序)导致断言失败,可以将结果反序列化为对象后验证属性:

// 不使用Mock的场景
String result = template.requestBody("direct:MyRoute", map, String.class);
Map<String, Object> resultMap = context.getTypeConverter().convertTo(Map.class, result);
assertEquals("your_name", resultMap.get("name"));

// 使用Mock的场景
mockResult.message(0).body().convertTo(Map.class).isEqualTo(map);

内容的提问来源于stack exchange,提问作者scafrs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:12:38