在父类中使用 @Nested的 JUnit 5测试类时,配合Spring Boot 4会出现UnsatisfiedDependencyException
免责声明: 这是一个最小可复现性示例(MRE)
我遇到了如下异常:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.MyTest': Unsatisfied dependency expressed through field 'myStr': No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
包含以下测试类:
public abstract class AbstractTest {
abstract void perform();
@Nested
class NestedTest {
@Test
void test() {
perform();
}
}
}
@SpringBootTest(classes = MyTest.InternalConfig.class)
class MyTest extends AbstractTest {
@Autowired
private String myStr;
@Override
void perform() {
assertThat(myStr).isNotNull();
}
@Configuration
public static class InternalConfig {
@Bean
public String myStr() {
return "test";
}
}
}
如果满足以下条件,该问题将消失:
- 没有嵌套测试
- 不存在继承关系
- 我降级到Spring Boot 3.5
解决方案
当你升级到Spring Boot 4时,你也同时升级到了Spring Framework 7,而 Spring Framework 7升级指南 指出如下:
这个
SpringExtension将Spring TestContext Framework集成到JUnit Jupiter中,现在改用基于测试方法作用域的ExtensionContext(参见 #35697)。虽然这一变更使在@Nested测试类层次结构中实现一致的依赖注入语义成为可能,但对于自定义TestExecutionListener实现而言,可能构成向后不兼容的变更。如果你发现升级到Spring Framework 7.0后,
@Nested测试类层次中的Spring相关集成测试开始失败,可能需要在这些层次结构中的顶层类上标注@SpringExtensionConfig(useTestClassScopedExtensionContext = true)注解。
作为替代,你可以用 @TestInstance(Lifecycle.PER_CLASS) 给 MyTest 添加注解,以达到同样的效果。
如需更多信息,请参阅我在Spring Framework问题跟踪器中发布的 此条注释。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。