Junit5 Spring Boot Autowire ComponentScan不起作用

时间:2018-09-19 12:45:37

标签: java spring junit5 spring-boot-test

我的问题:如果我的测试引用@Bean中列出的类中的@SpringBootTest声明,则自动装配有效。如果它引用@ComponentScan中列出的类自动@SpringBootTest定义的类,则自动装配失败。在测试之外,我的应用程序启动时不会出现自动装配或组件扫描问题,并且我可以确认要在测试中加载的服务在非测试中运行良好。我为地狱感到沮丧。我坏了,还是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 ;

MyConfig:

@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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我认为是因为您具有这样的注释:

@SpringBootTest (classes=MyConfig.class)

Spring只会在MyConfig.class中查找适当的bean,而找不到MyService的bean,但是,我认为当应用程序正常运行时,Spring将扫描所有软件包以查找bean。 。这就是为什么它在非测试中可以正常工作的原因。

答案 2 :(得分:0)

就像@Tudro所说的,org.junit.jupiter.api.Test用于Junit 5。org.junit.Test用于Junit 4。

在下面使用它:

@ExtendedWith(SpringExtension.class)
@SpringBootTest