猿问

Junit5 Spring Boot Autowire ComponentScan 不工作

我的问题:如果我的测试引用@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 ;

我的配置:


@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


慕容708150
浏览 321回答 3
3回答

阿晨1998

尽管测试开始了,但我遇到了与自动装配不起作用的相同问题,问题是我仍在使用旧的 junit4 @Test 注释。确保您的测试方法使用 juni5 包 org.junit.jupiter.api.Test 中的 @Test 进行注释。

MMMHUHU

我想是因为你已经这样注释了:@SpringBootTest (classes=MyConfig.class)Spring 只会寻找MyConfig.class合适的 bean 而无法为 找到一个MyService,但是,我认为当应用程序正常运行时,Spring 会扫描所有包以查找 bean。这就是它在非测试中工作正常的原因。

Cats萌萌

也许你可以添加 @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);    }}我的配置是一个简单的类@Configuration@ComponentScanpublic class ApplicationConfiguration {}
随时随地看视频慕课网APP

相关分类

Java
我要回答