在父类中使用 @Nested的 JUnit 5测试类时,配合Spring Boot 4会出现UnsatisfiedDependencyException

后端开发 2026-07-12

免责声明: 这是一个最小可复现性示例(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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章