我正在使用@WebMvcTest
注释创建测试,并发现如果我在应用程序类中有一个@ComponentScan
注释,它将破坏测试的预期行为。
根据WebMvcTest
javadoc:
使用此注释将禁用完全自动配置,而只应用与MVC测试相关的配置(即
@Controller
,@ControllerAdvice
,@JsonComponent Filter
,WebMvcConfigurer
和{{1 } bean但不是HandlerMethodArgumentResolver
,@Component
或@Service
bean)。"
问题在于,使用@Repository
实例化用@ComponentScan
注释的bean。如果代替@Service
我在@ComponentScan
注释中指定扫描基础包,一切都按预期工作。
当我在@SpringBootApplication
注释中指定控制器类时,会发生另一个问题。当应用程序类中有@WebMvcTest
注释时,它将加载所有控制器,而不是仅加载指定的控制器。
这是Spring Boot中的错误吗?
我想使用@ComponentScan
,因为@ComponentScan
注释中没有excludeFilters
属性。
我找到的解决方法是创建一个带有@SpringBootApplication
注释的单独类,并将@Configuration
移到那里。
答案 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,这就是行为不同的原因。