【问题标题】:Junit5 Spring Boot Autowire ComponentScan Not WorkingJunit5 Spring Boot Autowire ComponentScan不起作用
【发布时间】:2018-09-19 12:45:36
【问题描述】:

我的问题:如果我的测试引用了@SpringBootTest 中列出的类中的@Bean 声明,则自动装配可以工作。如果它通过@SpringBootTest 中列出的类自动引用一个类@ComponentScanned,则自动装配失败。在测试之外,我的应用程序在没有自动装配或组件扫描问题的情况下启动,并且我可以确认我想要在我的测试中加载的服务在非测试中运行良好。我很沮丧。我是坏了,还是 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

【问题讨论】:

  • @RunWith(SpringRunner.class) @SpringBootTest(classes = MyConfig .class) 试试这个
  • SpringRunner 是 Junit4。
  • 就此而言,@RunWith 也是如此。删除它不会改变任何东西,所以我把它从我的样本中取出。

标签: java spring junit5 spring-boot-test


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我想是因为你已经这样注释了:

    @SpringBootTest (classes=MyConfig.class)
    

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

    【讨论】:

    • 有趣。如果 MyConfig 已经是启用了扫描仪的配置,我如何让它扫描我需要扫描的包?
    • 也许尝试将@ComponentScan 注释添加到测试类。 - 我对 Spring 测试注解不是很熟悉,通常为每个项目设置一次,然后忘记它是如何工作的
    • @billmill 如果你只用 @SpringBootTest 注释你的类,它会首先检查是否有一个嵌套的 @Configuration 类可用,如果没有,则自动查找用 @SpringBootConfiguration 注释的类类路径,@SpringBootApplication 即用@SpringBootConfiguration 注释,因此应该找到。如果您通过@SpringBootTest 提供类,则采用这些类,而不是让 Spring 确定实际的 Spring 引导应用程序类。
    【解决方案3】:

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

    在下面使用这个:

    @ExtendedWith(SpringExtension.class)
    @SpringBootTest
    

    【讨论】:

    • org.junit.jupiter.api.extension.ExtendWith,而不是 ExtendedWith!
    • @ExtendedWith(SpringExtension.class) 已在@SpringBootTest 中调用
    【解决方案4】:

    也许你可以添加@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
    @ComponentScan
    public class ApplicationConfiguration {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2016-06-02
      • 2017-06-10
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多