应用程序类中的@ComponentScan破坏@WebMvcTest和@SpringBootTest

时间:2017-11-01 12:20:24

标签: spring-boot spring-boot-test

我正在使用@WebMvcTest注释创建测试,并发现如果我在应用程序类中有一个@ComponentScan注释,它将破坏测试的预期行为。

根据WebMvcTest javadoc:

  

使用此注释将禁用完全自动配置,而只应用与MVC测试相关的配置(即@Controller@ControllerAdvice@JsonComponent FilterWebMvcConfigurer和{{1 } bean但不是HandlerMethodArgumentResolver@Component@Service bean)。"

问题在于,使用@Repository实例化用@ComponentScan注释的bean。如果代替@Service我在@ComponentScan注释中指定扫描基础包,一切都按预期工作。

当我在@SpringBootApplication注释中指定控制器类时,会发生另一个问题。当应用程序类中有@WebMvcTest注释时,它将加载所有控制器,而不是仅加载指定的控制器。

这是Spring Boot中的错误吗?

我想使用@ComponentScan,因为@ComponentScan注释中没有excludeFilters属性。

我找到的解决方法是创建一个带有@SpringBootApplication注释的单独类,并将@Configuration移到那里。

1 个答案:

答案 0 :(得分:4)

找到了这种奇怪行为的原因。

这是@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中的@ComponentScan注释指定了excludedFilters属性。

当我在我的应用程序类中直接添加@ComponentScan注释时,我没有指定默认的excludedFilters,这就是行为不同的原因。