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
相关产品推荐
相关产品推荐

