我目前正在尝试将一个大型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注解的类,但以同样的方式失败。
1条答案
按热度按时间q3aa05251#
你应该在@SpringBootTest annotation中提供一个class,指向一个用@SpringBootApplication注解的class。这样整个SpringBoot启动就会正常进行。你不需要指定任何AutoConfiguration来处理,因为它会在测试时自动知道你使用的classpath。
您可以查看this article from baeldung