为什么SpringBootTests不调用SpringBootApplication类的主方法

时间:2019-09-28 01:33:48

标签: spring-boot

我试图弄清楚为什么会这样。我的main()方法包含一些初始化过程,这些初始化过程对于应用程序启动至关重要,而Spring Boot集成测试并未调用该初始化过程。 有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:5)

Spring Boot测试不需要调用SpringBootApplication.main(),因为它可以自己扫描pacakes中的配置。它试图模仿使用Spring Boot框架创建上下文的过程。换句话说,它基于程序包结构进行扫描,从预定义的位置加载外部配置,可以选择运行自动配置启动器,等等。有趣的是,如果您仅将@SpringBootTest放在测试类中,则扫描过程将朝上方向进行

示例: 对于以下项目结构

└── com
    └── example
        └── demo
            ├── config
            │   └── AppConfig.java
            ├── test
            |   └── SpringBootAppTest.java
            └── DemoApplication.java

Spring Boot测试将在以下位置搜索SpringBootConfiguration

  1. com.example.demo.test
  2. com.example.demo
  3. com.example
  4. 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