自定义元注解替代Spring MVC测试注解后mockMvc未初始化问题
解决自定义@MyWebMvcTest元注解导致MockMvc未初始化的问题
问题场景
给每个控制器测试类都用了@WebMvcTest、@AutoConfigureMockMvc(addFilters = false)和@Import(JacksonConfig::class)三个注解。想仿照Spring Boot嵌套注解的思路,自定义一个元注解@MyWebMvcTest整合这三个注解。参考示例创建注解并配置@AliasFor映射WebMvcTest的controllers属性后,测试启动时报错:lateinit property mockMvc has not been initialized,添加@Retention(RetentionPolicy.RUNTIME)后问题依然存在。
解决方案
问题根源在于元注解的@AliasFor映射配置不规范,以及元注解的属性继承逻辑未生效,正确的自定义元注解配置如下:
1. 编写正确的元注解
@Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS) @WebMvcTest(controllers = []) @AutoConfigureMockMvc(addFilters = false) @Import(JacksonConfig::class) annotation class MyWebMvcTest( @get:AliasFor(annotation = WebMvcTest::class, attribute = "controllers") val controllers: Array<KClass<*>> = [] )
2. 关键配置说明
- 必须显式指定
@WebMvcTest(controllers = [])作为元注解的默认值,避免属性传递时的冲突 @AliasFor要精准关联WebMvcTest的controllers属性,且用@get:修饰保证Kotlin中属性的正确映射- 补充
@Target(AnnotationTarget.CLASS),确保注解能被应用到测试类上
3. 测试类中使用自定义元注解
在控制器测试类上直接使用:
@MyWebMvcTest(controllers = [DemoController::class]) class DemoControllerTest { @Autowired lateinit var mockMvc: MockMvc // 测试方法... }
原因解析
如果@AliasFor映射不正确,Spring无法将自定义注解的controllers属性传递给@WebMvcTest,导致@WebMvcTest没有加载指定的控制器Bean,进而MockMvc无法被Spring容器初始化。只有规范配置元注解的属性映射和范围,才能让Spring正确识别并继承@WebMvcTest的功能。
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

