我试图弄清楚为什么会这样。我的main()
方法包含一些初始化过程,这些初始化过程对于应用程序启动至关重要,而Spring Boot集成测试不会调用它。
有人可以解释这种行为吗?
最佳答案
春季启动测试不需要调用SpringBootApplication.main()
,因为它可以自己扫描pacakes中的配置。它试图模仿使用Spring Boot框架创建上下文的过程。换句话说,它基于程序包结构进行扫描,从预定义的位置加载外部配置,可以选择运行自动配置启动器等。有趣的是,如果仅将@SpringBootTest
放在测试类中,则扫描过程将朝上进行
例:
对于以下项目结构
└── com
└── example
└── demo
├── config
│ └── AppConfig.java
├── test
| └── SpringBootAppTest.java
└── DemoApplication.java
Spring Boot测试将在以下位置搜索
SpringBootConfiguration
:com.example.demo.test
com.example.demo
com.example
com
因此,当找到
SpringBootApplication
(即SpringBootConfiguration
)时,将加载上下文,以便在示例案例com.example.demo.configuration
中从另一个方向扫描其他配置和bean。因此,将加载所有上下文。例如,如果将
SpringBootAppTest
向上移动到com.example
,它将失败(因为找不到SpringBootApplication
),并显示以下错误:java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test