使用WebTestClient编写集成测试时遇HV000183初始化异常求助
这个问题我之前做Spring Boot控制器切片测试的时候也踩过坑!咱们来拆解一下原因和解决办法:
问题根源
你用WebTestClient做仅启动控制器的集成测试(比如用@WebMvcTest注解)时,Hibernate Validator(Spring默认的Bean校验框架)初始化需要依赖EL表达式工厂(javax.el.ExpressionFactory)来支持校验逻辑(比如消息插值、复杂校验规则的表达式解析)。但切片测试的依赖环境里,默认没引入EL相关的实现类,就导致了这个初始化异常。
另外从Spring Boot 2.3版本开始,spring-boot-starter-validation不再包含在spring-boot-starter-web里了,如果你的项目没手动引入这个starter,也会触发这个问题。
解决方案
根据你的测试需求,选下面其中一种方案就行:
方案1:引入完整的校验starter(推荐)
如果你的控制器用到了@Valid、@NotEmpty这类校验注解,直接引入Spring Boot的校验starter,它会自动帮你配齐所有校验相关的依赖(包括EL实现):
Maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <scope>test</scope> </dependency>
Gradle依赖:
testImplementation 'org.springframework.boot:spring-boot-starter-validation'
方案2:仅引入EL表达式依赖
如果不想引入整个校验starter,只需要单独添加EL实现的依赖(比如Glassfish的EL实现):
Maven依赖:
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b11</version> <scope>test</scope> </dependency>
方案3:禁用校验自动配置(仅当不需要校验时)
如果你的测试完全不需要校验功能,可以在测试类里排除校验的自动配置类,跳过Validator的初始化:
@WebMvcTest( controllers = YourTargetController.class, excludeAutoConfiguration = ValidationAutoConfiguration.class ) public class YourControllerTest { // 测试代码 }
额外提示
检查一下你的测试类注解,如果是用@SpringBootTest配合WebTestClient,其实会加载完整的Spring上下文,一般不会出现这个问题;但切片测试(@WebMvcTest)因为只加载最小化的上下文,才会遇到依赖缺失的情况。
内容的提问来源于stack exchange,提问作者nateha1984

