我从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的配置? 有点奇怪!为什么要扫描同级目录中的配置?
答案 0 :(得分:1)
这是 Spring TestContext Framework 中的预期行为。如果您未明确指定要使用哪个@Configuration
类,则Spring将在当前测试类中查找静态嵌套的类。
以下是Spring参考手册Testing chapter的摘录。
如果从
@ContextConfiguration
批注中省略了classes属性,则TestContext框架将尝试检测默认配置类的存在。具体来说,AnnotationConfigContextLoader
和AnnotationConfigWebContextLoader
根据@Configuration
javadoc中的指定,检测满足配置类实现要求的测试类的所有静态嵌套类。请注意,配置类的名称是任意的。此外,如果需要,测试类可以包含多个静态嵌套配置类。
由于您使用的是Spring Boot,因此应使用@SpringBootTest
注释测试类,以使Spring Boot找到您的@Configuration
类。