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

Sleuth Baggage集成测试直接调用服务不生效问题求助

问题根因

Sleuth 的 Baggage 能力必须依附于*活跃的追踪上下文(Trace/Span)*才能正常工作:

  • 通过MockMvc发起HTTP请求时,Sleuth内置的请求过滤器会自动为请求初始化完整的追踪上下文,所以Baggage读写正常
  • 直接调用服务层方法时,没有请求链路触发上下文初始化,当前线程不存在活跃Span,BaggageField的读写操作会直接失效
解决方案

只需在直接调用服务层的测试用例中,手动初始化追踪上下文即可,修改测试代码如下:

@SpringBootTest
@AutoConfigureMockMvc
class MyApplicationTests {

    @Autowired
    MyService myService;

    @Autowired
    MockMvc mockMvc;

    // 注入Sleuth的Tracer工具类
    @Autowired
    Tracer tracer;

    @Test
    void testBaggageByService() {
        // 手动创建并启动一个Span,激活当前线程的追踪上下文
        try (Tracer.SpanInScope ignored = tracer.nextSpan().start()) {
            assertThat(myService.updateAndGet()).isEqualTo("value");         // 测试可正常通过
        }
    }

    @Test
    void testBaggageByController() throws Exception {
        mockMvc.perform(get("/")).andExpect(content().string("value"));  // 无需修改,原有逻辑保持正常
    }
}
可选扩展

如果需要模拟上游传递的Baggage初始值,可在激活Span后手动设置初始值即可,示例如下:

@Test
void testBaggageWithInitialValue() {
    try (Tracer.SpanInScope ignored = tracer.nextSpan().start()) {
        // 模拟上游传递的Baggage值
        myBaggageField.updateValue("initial-value");
        // 后续调用业务逻辑即可读取到设置的初始值
        // ...
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:15:03