Spring/Kotlin中枚举列表作为路径变量的RestAssured测试问题咨询
解决方案
1. 先修正Spring控制器配置
首先要确保控制器路径包含正确的路径变量占位符,且Spring支持逗号分隔字符串转枚举列表:
@GetMapping(path = ["/engine/workday/{days}"], produces = ["application/json;charset=UTF-8"]) @ApiOperation("Process by days of week") fun processByDaysOfWeek(@PathVariable days: List<DayOfWeek>): Any { // 业务逻辑实现 } enum class DayOfWeek { MONDAY, WEDNESDAY, THURSDAY, FRIDAY; }
Spring MVC 默认内置了字符串到集合的转换器,可自动将逗号分隔的路径变量转为对应枚举列表,无需额外配置。如果出现转换失败的情况,可以手动注册自定义转换器:
import org.springframework.core.convert.converter.Converter import org.springframework.stereotype.Component @Component class StringToDayOfWeekListConverter : Converter<String, List<DayOfWeek>> { override fun convert(source: String): List<DayOfWeek> { return source.split(",").map { DayOfWeek.valueOf(it.trim()) } } }
2. 修改RestAssured测试传参逻辑
直接传入List对象时,RestAssured会默认调用List的toString方法生成[MONDAY, THURSDAY]格式的字符串,URL编码后就会出现你遇到的异常路径。只需要提前将枚举列表拼接为逗号分隔的纯字符串再传入即可:
val days = listOf(DayOfWeek.MONDAY, DayOfWeek.THURSDAY) // 拼接为逗号分隔的字符串 val pathParamValue = days.joinToString(separator = ",") RestAssured .given() .spec(spec) .pathParam("days", pathParamValue) .get("/engine/workday/{days}") .then() .statusCode(200) .extract().`as`(JsonNode::class.java)
修改后生成的请求路径就会是你预期的http://localhost:xx/engine/workday/MONDAY,THURSDAY格式。
内容的提问来源于stack exchange,提问作者BusyBee
相关产品推荐
相关产品推荐

