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

如何在Apache Camel 3.X.X路由的隔离测试中设置Header?

Camel路由隔离测试自定义Header实现方案

你不需要修改原有业务路由的代码,有两种常用方案可以实现测试场景下的自定义Header设置:

方案1:发送请求时直接携带Header(轻量化首选)

适合单测试用例需要自定义不同Header的场景,直接调用ProducerTemplate的带Headers参数的发送方法即可:

@Test
fun `should test route`() {
    // 构造测试需要的所有Header
    val testHeaders = mapOf(
        "requestId" to "test_001",
        "userId" to "10086",
        "bizType" to "order"
    )
    // 同时传入body和header集合
    template.sendBodyAndHeaders("", testHeaders)

    // 可在Mock端点验证Header是否正常传递
    destEndpoint.expectedHeaderReceived("userId", "10086")
    destEndpoint.expectedMessageCount(1)
    destEndpoint.assertIsSatisfied()
}

方案2:用AdviceWith织入路由统一添加Header

适合所有测试用例都需要相同固定Header的场景,避免每次发送请求重复传Header:

  1. 首先在测试类上新增@UseAdviceWith注解,开启路由修改权限
@SpringBootTest
@MockEndpoints
@UseAdviceWith // 新增AdviceWith支持注解
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
class MyRouteTest {
  1. 在测试前置方法中修改目标路由,添加Header设置逻辑:
@Autowired
lateinit var camelContext: CamelContext

@Produce(uri = "direct:abc")
lateinit var template: ProducerTemplate

@EndpointInject(uri = "mock:direct:xyz")
lateinit var destEndpoint: MockEndpoint

@BeforeEach
fun setUp() {
    val modelContext = camelContext.adapt(ModelCamelContext::class.java)
    val routeDef = modelContext.getRouteDefinition("abc-route")
    
    // 在路由执行的最开头插入设置Header的逻辑
    routeDef.adviceWith(modelContext, object : AdviceWithRouteBuilder() {
        override fun configure() {
            weaveAddFirst().setHeader("tenantId", constant("test_tenant_01"))
            weaveAddFirst().setHeader("sourceRoute", constant("test_mock"))
            // 可以按需添加所有需要的Header
        }
    })
    // 修改完成后启动Camel上下文
    camelContext.start()
}

@Test
fun `should test route`() {
    // 直接发送body即可,Header会自动被织入的逻辑添加
    template.sendBody("")
    
    destEndpoint.expectedHeaderReceived("tenantId", "test_tenant_01")
    destEndpoint.assertIsSatisfied()
}

常见问题说明

之前调用adapt方法无法修改路由,大概率是没有添加@UseAdviceWith注解,或者修改路由时Camel上下文已经处于启动状态。搭配@DirtiesContext注解每次测试前刷新上下文,即可保证修改路由时上下文处于可编辑的未启动状态。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:51:04