我目前正在尝试将一个大型 Java 8 项目从 Spring Boot 1.5 升级到 Spring Boot 2.7(是的,我知道,已经很晚了)。我无法弄清楚的一件事是,SB2 中的 @SpringBootTest 似乎没有像以前那样提供 ApplicationContext。我们有许多需要 Autowired 组件的集成测试(这就是我们使用 @SpringBootTest 注释的原因,因为我们想要在完整的 ApplicationContext 下进行测试)。这些测试过去在 SB 1.5 中运行良好,但在 SB 2.7 中,这些 IT 因 NoSuchBeanDefinitionException 导致“无法加载 ApplicationContext”而崩溃。我们没有对我们的应用程序 @ComponentScans 做任何奇怪的事情,所有这些据称丢失的 bean 都可以在我们应用程序自己的包/子包或 Spring 本身中找到(即,应该自动找到 bean 的所有常见位置) .
我发现让这些测试成功的唯一方法是添加显式的 @ContextConfiguration 并添加提供 bean 可能需要的每个特定配置类(在我们的应用程序代码和 Spring 中)。所以我最终得到的 IT 看起来像这样:
package my.app;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = {
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration.class,
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration.class,
org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean.class,
my.app.config.SecurityConfig,
my.app.config.SomeConfig
})
public class SomeTestIT
{ …
// some Autowiring required here
}
(自动配置就这么多!)这种方法最终是有效的,但它很乏味,而且看起来相当脆弱,我真的很想理解为什么 ApplicationContext 不只是像它那样构建在这些 @SpringBootTest IT 中实际应用程序(以及 SB 1.5 的这些 IT 的使用方式)。
我们使用 Java 8 (OpenJDK)、maven-failsafe-plugin 3.1.2、Spring Boot 2.7.11、Spring Test 5.3.27(使用 junit4.SpringRunner)、junit 4.13.2。
您应该在@SpringBootTest注释中提供一个类,该类指向用@SpringBootApplication注释的类。这样整个SpringBoot启动就正常了。您不需要指定任何自动配置来处理,因为它会自动意识到测试时使用的类路径。
您可以查看baeldung的这篇文章