代码之家  ›  专栏  ›  技术社区  ›  Ashok Koyi

@带有SpringExtension的ContextConfiguration没有检测到显式定义的@Bean

  •  0
  • Ashok Koyi  · 技术社区  · 7 年前

    我正在使用JUnit5和 SpringExtension . 但是由于这个原因,第一个测试成功了,而第二个测试失败了

    package com.acme;
    
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit.jupiter.SpringExtension;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(classes = ConfigurationTest.Config.class)
    public class ConfigurationTest {
      @Test
      void explicitContextTest() {
        AnnotationConfigApplicationContext applicationContext =
            new AnnotationConfigApplicationContext(Config.class);
        assertThat(applicationContext.getBean(Skeleton.class)).isNotNull();
      }
    
      @Test
      void contextConfigInjectionTest(Skeleton skeleton) {
        assertThat(skeleton).isNotNull();
      }
    
      @Configuration
      static class Config {
        @Bean
        Skeleton skeleton() {
          return new SkeletonImpl();
        }
      }
    
      interface Skeleton {
      }
    
      static class SkeletonImpl implements Skeleton {
      }
    }
    

    附言:如果我加上 @ComponentScan Config 级别,第二次测试也成功了。问题是为什么spring测试不能检测显式定义的bean,除非我要求它显式扫描

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ashok Koyi    7 年前

    看来我得详细说明一下 @Autowired

    我刚试过。这很管用

    package com.acme;
    
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit.jupiter.SpringExtension;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(classes = ConfigurationTest.Config.class)
    public class ConfigurationTest {
      @Test
      void explicitContextTest() {
        AnnotationConfigApplicationContext applicationContext =
            new AnnotationConfigApplicationContext(Config.class);
        assertThat(applicationContext.getBean(Skeleton.class)).isNotNull();
      }
    
      @Test
      void contextConfigInjectionTest(@Autowired Skeleton skeleton) {
        assertThat(skeleton).isNotNull();
      }
    
      @Configuration
      static class Config {
        @Bean
        Skeleton skeleton() {
          return new SkeletonImpl();
        }
      }
    
      interface Skeleton {
      }
    
      static class SkeletonImpl implements Skeleton {
      }
    }
    

    根据Spring扩展实现,Spring期望 @自动连线 @Qualifier / @Value 出席。只有这样,spring才能根据 ApplicationContext

    https://github.com/spring-projects/spring-framework/blob/0ad9349d84a725dc37499bcb0ed2aad0de770c73/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/SpringExtension.java#L156-L163