Spring Boot3+Micrometer Tracing测试:SimpleTracer类型转换异常求助
问题解决:SimpleTraceContext 转 BraveTraceContext 类型转换异常
错误原因
你的应用同时引入了Micrometer Tracing的Brave桥接实现,且测试中手动注册了SimpleTracer测试组件,导致Spring上下文里同时存在两种Trace实现,在TraceContext传递时触发类型转换冲突。
解决方案
1. 排除Brave自动配置
在测试类上添加排除Brave自动配置的注解,阻止Brave相关组件加载:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, exclude = {BraveAutoConfiguration.class}) @EnableAutoConfiguration(exclude = BraveAutoConfiguration.class) @EnableTestObservation class DemoApplicationTests { // 原有测试代码 }
2. 确保SimpleTracer Bean的优先级
在测试配置的SimpleTracer Bean上添加@Primary注解,保证它被优先注入:
@TestConfiguration class ObservationTestConfiguration { @Bean @Primary SimpleTracer simpleTracer() { return new SimpleTracer(); } }
3. 调整依赖配置
如果生产依赖包含micrometer-tracing-bridge-brave,确保测试环境不会加载Brave实现:
- Gradle示例:
implementation 'io.micrometer:micrometer-tracing-bridge-brave' testImplementation 'io.micrometer:micrometer-tracing-test' // 可选:排除测试依赖中的Brave桥接 testImplementation('io.micrometer:micrometer-tracing-test') { exclude group: 'io.micrometer', module: 'micrometer-tracing-bridge-brave' }
- Maven示例:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </exclusion> </exclusions> </dependency>
4. 简化测试配置(推荐)
直接使用Micrometer提供的@SimpleTracerTest注解替代自定义的@EnableTestObservation,它会自动配置SimpleTracer并排除其他Trace实现:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @SimpleTracerTest class DemoApplicationTests { // 原有测试代码 }
完成以上修改后,测试上下文将仅存在SimpleTracer相关组件,类型转换冲突即可解决。
内容的提问来源于stack exchange,提问作者Carlos Gonzalez
相关产品推荐
相关产品推荐

