如何在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:
- 首先在测试类上新增
@UseAdviceWith注解,开启路由修改权限
@SpringBootTest @MockEndpoints @UseAdviceWith // 新增AdviceWith支持注解 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class MyRouteTest {
- 在测试前置方法中修改目标路由,添加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
相关产品推荐
相关产品推荐

