Spring Boot2升级3后测试上下文‘Failed to introspect class’问题解决
解决Spring Boot 3升级后测试上下文加载时
javax.activation.DataSource找不到的问题 方案1:添加javax.activation兼容测试依赖
原库的DefaultEmailService依赖旧的javax API,测试阶段类加载会缺失该类,直接在构建工具中添加测试范围的依赖即可,不会影响主应用的Jakarta环境:
Maven
<dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> <scope>test</scope> </dependency>
Gradle
testImplementation 'javax.activation:activation:1.1.1'
方案2:在测试上下文排除原库自动配置类
如果不想引入javax依赖,可以找到it.ozimov库中注册defaultEmailService的自动配置类,在@SpringBootTest中排除它,避免Spring加载原库的DefaultEmailService类:
@SpringBootTest(exclude = {OzimovSpringBootFreemarkerEmailAutoConfiguration.class}) public class YourTestClass { // 测试代码 }
注:若不清楚具体自动配置类名,可查看原库的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,或通过日志打印自动配置加载情况定位目标类。
方案3:测试配置中覆盖原Bean并移除原Bean定义
创建测试专用配置类,注册自己重写的EmailService并标记为@Primary,同时移除原库的defaultEmailService Bean定义:
@TestConfiguration public class TestEmailConfig implements BeanFactoryPostProcessor { @Primary @Bean public EmailService customEmailService() { // 返回你重写的EmailService实现 return new YourCustomEmailService(); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; if (registry.containsBeanDefinition("defaultEmailService")) { registry.removeBeanDefinition("defaultEmailService"); } } }
在测试类中引入该配置:
@SpringBootTest @Import(TestEmailConfig.class) public class YourTestClass { // 测试代码 }
内容的提问来源于stack exchange,提问作者Joan
相关产品推荐
相关产品推荐

