@SpringBootApplication注解在JUnit Tests中的作用

@SpringBootApplication annotation effects in JUnit Tests

我有一个 spring 引导非网络应用程序。

我已经为我的应用程序添加了一些运行良好的集成测试。

我的主要 class 注释为 @SpringBootApplication,我的集成测试 class 注释为 @RunWith(SpringRunner.class)@SpringBootTest

如果我将主要 class 注释更改为 @Configuration@ComponentScan @EnableAutoConfiguration 更明确地说,我的测试 class 给出一个编译时错误,说它无法检测到正在使用的 classes 之一,并迫使我添加更多信息。

所以我必须更改注释如下 @RunWith(SpringRunner.class)@SpringBootTest(classes = EligibilityJobRunner.class)

我读到 @SpringBootApplication 是上述三个注释的方便注释,那么为什么会有这种差异?非常感谢。

@SpringBootApplication 是一个元注释,它应用的注释比您用它替换的注释更多:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

如果您不想使用 @SpringBootApplication,请尝试使用以下所有注释来注释您的 class:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

在您的情况下,缺少 @SpringBootConfiguration

下次 运行 测试时,在 SpringBootTestContextBootstrapper.java 中的不同点放置调试断点,以查看幕后发生的情况。

但我认为这些行显示了问题所在:

    Class<?> found = new SpringBootConfigurationFinder()
            .findFromClass(mergedConfig.getTestClass());
    Assert.state(found != null,
            "Unable to find a @SpringBootConfiguration, you need to use "
                    + "@ContextConfiguration or @SpringBootTest(classes=...) "
                    + "with your test");