为什么@SpringBootTest在Spring Boot 2升级后找不到任何Bean?

jhkqcmku  于 11个月前  发布在  Spring
关注(0)|答案(1)|浏览(162)

我目前正在尝试将一个大型Java 8项目从Sping Boot 1.5升级到Sping Boot 2.7(是的,很晚才参加聚会,我知道)。有一件事我不明白,SB 2中的@SpringBootTest似乎没有像以前那样提供ApplicationContext。我们有许多集成测试需要Autowired组件(这就是为什么我们使用@SpringBootTest注解,因为我们希望在完整的ApplicationContext下进行测试)。这些测试在SB 1.5中可以正常工作,但在SB 2.7中,这些IT被“Failed to load ApplicationContext”轰炸,我们并没有对我们的app @ ProjentScans做任何奇怪的事情,所有这些据称丢失的bean都可以在我们的应用程序自己的包/子包中找到,或者在Spring本身中找到(即,应该自动找到bean的所有常用位置)。
我发现让这些测试成功的唯一方法是添加一个显式的@ContextConfiguration,并添加每个可能需要提供bean的特定配置类(在我们的应用程序代码和Spring中)。所以我最终得到的IT看起来像这样:

package my.app.submodule;

@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
}

字符串
(So多为自动配置!)这种方法最终会起作用,但它很乏味,而且看起来相当脆弱,我真的很想理解为什么ApplicationContext不像在实际应用程序中那样(以及在SB 1.5中用于这些IT的方式)在这些@SpringBootTest IT中构建。
我们使用Java 8(OpenJDK),maven-failsafe-plugin 3.1.2,Sping Boot 2.7.11,Spring Test 5.3.27(using junit4.SpringRunner),junit 4.13.2.
有人建议我在@SpringBootTest注解中显式引用我的测试应用程序类,所以我尝试了:

package my.app.submodule;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {my.app.MyTestApplication.class})
public class SomeTestIT
{ …
    // some Autowiring required here
}


其中MyTestApplication是一个用@SpringBootApplication注解的类,但以同样的方式失败。

q3aa0525

q3aa05251#

你应该在@SpringBootTest annotation中提供一个class,指向一个用@SpringBootApplication注解的class。这样整个SpringBoot启动就会正常进行。你不需要指定任何AutoConfiguration来处理,因为它会在测试时自动知道你使用的classpath。
您可以查看this article from baeldung

相关问题