Junit5 Spring 引导自动装配 ComponentScan 不工作

Junit5 Spring Boot Autowire ComponentScan Not Working

我的问题:如果我的测试引用 @SpringBootTest 中列出的 class 中的 @Bean 声明,则自动装配有效。如果它引用 @SpringBootTest 中列出的 class 自动 @ComponentScan 的 class,则自动装配失败。在测试之外,我的应用程序启动时没有自动装配或组件扫描问题,我可以确认我想在测试中加载的服务在非测试中运行良好。我很沮丧。我坏了,还是 Spring Boot 2 上的 Junit5 功能?

我的测试:

@ExtendWith(SpringExtension.class)
@SpringBootTest (classes=MyConfig.class)
public class MyTest {
    // fails to autowire
    @Autowired
    private MyService _mySvc ;

    // succeeds!
    @Autowired @Qualifier ( "wtf" )
    private String _wtf ;

我的配置:

@EnableWebMvc
@SpringBootApplication ( scanBasePackages = "my.packaging" )
@Configuration
public class MyConfig {

    @Bean
    public String wtf ( ) { return "W T F???" ; }

    // No @Bean for MyService because component scan is nicer in the non-test world

我想是因为你这样注释:

@SpringBootTest (classes=MyConfig.class)

Spring 只会在 MyConfig.class 中查找合适的 bean,无法为 MyService 找到合适的 bean,但是,我认为 Spring 会扫描所有当应用程序正常 运行 时,为 bean 打包。这就是它在非测试中运行良好的原因。

我遇到了同样的问题,尽管测试已经开始,但自动装配无法正常工作,问题是我仍在使用旧的 junit4 @Test 注释。 确保您的测试方法使用来自 juni5 包 org.junit.jupiter.api.Test 的 @Test 注释。

正如@Tudro 所说,org.junit.jupiter.api.Test 适用于 Junit 5。org.junit.Test 适用于 Junit 4。

在下面使用这个:

@ExtendedWith(SpringExtension.class)
@SpringBootTest

也许你可以添加 @ContextConfiguration(classes = ApplicationConfiguration.class)

看起来像这样

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import example06.junit.group01.Piano;

@SpringBootTest
@ContextConfiguration(classes = ApplicationConfiguration.class)
public class ApplicationConfigurationTest {
    @Autowired
    private Piano piano;
    
    @Test
    public void shouldTestPiano() {
        System.err.println("Testing JUnit5 > " + piano);
    }
}

我的配置很简单class

@Configuration
@ComponentScan
public class ApplicationConfiguration {

}