JUnit测试中的@SpringBootApplication注释效果

时间:2017-05-01 15:22:37

标签: spring spring-boot annotations spring-boot-test

我有一个spring boot非web应用程序。

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

我的主要类使用@SpringBootApplication进行注释,我的集成测试类使用@RunWith(SpringRunner.class)@SpringBootTest进行注释。

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

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

我已经读过@SpringBootApplication是上面提到的三个注释的便利注释那么为什么会出现这种差异?非常感谢。

1 个答案:

答案 0 :(得分:0)

@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,请尝试使用以下所有注释注释您的课程:

@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");