【问题标题】:@SpringBootApplication annotation effects in JUnit TestsJUnit 测试中的 @SpringBootApplication 注解效果
【发布时间】:2017-05-01 15:22:37
【问题描述】:

我有一个 Spring Boot 非 Web 应用程序。

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果我添加@SpringBootConfiguration 而不是普通的@Configuration,似乎在运行时工作。但由于某种原因,Intellij 仍然向我显示编译时错误。
    • IntelliJ 的 bug 跟踪器上有一张公开票,可以更好地与 Spring Boot 集成,它仍处于 porgress 中:youtrack.jetbrains.com/issue/IDEA-139669。我建议你也在那里提及这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2017-05-23
    • 1970-01-01
    • 2012-01-19
    • 2013-01-21
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多