Spring在测试期间从package-private类获取配置

时间:2019-01-25 15:38:08

标签: java spring spring-boot junit spring-test

我从Spring 2.0更新到Spring boot 2.1,并且服务测试失败。

我的测试结构:

com
  ...
    service
      ServiceTest.java
    web
      ControllerTest.java

ServiceTest.java:

@ExtendWith(SpringExtension.class)
@DataJpaTest
public class ServiceTest {

    @Autowired
    private OtherService otherService;

    ...

}

ControllerTest.java:

@ExtendWith(SpringExtension.class)
@WebMvcTest(secure = false)
@Import(WebMvcConfig.class)
@SuppressWarnings("Duplicates")
public class GroupControllerTest {

    @Configuration
    static class Config {
        @Bean
        public Controller controller() {
            return new Controller();
        }
    }
}

在ServiceTest期间出现错误:

  

原因:   org.springframework.beans.factory.support.BeanDefinitionOverrideException:   在类路径中定义了名称为“ controller”的无效bean定义   资源[com /.../ web / ControllerTest $ Config.class]

Spring如何从GroupControllerTest的内部package-private类获取ServiceTest的配置? 有点奇怪!为什么要扫描同级目录中的配置?

1 个答案:

答案 0 :(得分:1)

这是 Spring TestContext Framework 中的预期行为。如果您未明确指定要使用哪个@Configuration类,则Spring将在当前测试类中查找静态嵌套的类。

以下是Spring参考手册Testing chapter的摘录。

  

如果从@ContextConfiguration批注中省略了classes属性,则TestContext框架将尝试检测默认配置类的存在。具体来说,AnnotationConfigContextLoaderAnnotationConfigWebContextLoader根据@Configuration javadoc中的指定,检测满足配置类实现要求的测试类的所有静态嵌套类。请注意,配置类的名称是任意的。此外,如果需要,测试类可以包含多个静态嵌套配置类。

由于您使用的是Spring Boot,因此应使用@SpringBootTest注释测试类,以使Spring Boot找到您的@Configuration类。