Spring Boot升级后单元测试hasOnlyOneElementSatisfying报错
问题根因
- 该问题是Spring Boot版本升级时,连带升级了内置依赖的AssertJ断言库版本导致的API兼容问题,和业务代码、Spring Boot核心运行逻辑无关。
- AssertJ从3.23.0版本开始,将迭代器断言类下的
hasOnlyOneElementSatisfying方法标记为废弃,官方将单元素场景的断言逻辑重构到了语义更清晰的新API下。 - 编译时提示
Unresolved reference的本质原因:高版本中废弃的hasOnlyOneElementSatisfying方法泛型签名做了调整,Kotlin编译器无法通过方法签名自动推断lambda入参response的实际类型,默认将其识别为Any类型,自然无法访问SearchResponse类定义的eeId、personId属性。
修复方案
优先推荐迁移到AssertJ高版本官方推荐的新API,无废弃警告,泛型推断完全正常,修改断言部分代码如下:
assertThat(service.result) .hasSize(1) .singleElement() .satisfies { response -> assertThat(response.eeId).isEqualTo("same eeId") assertThat(response.personId).isEqualTo(uuid) }
如果暂时需要保留旧方法的调用逻辑,只需要在lambda中显式声明入参类型,跳过编译器的泛型推断步骤即可解决未解析引用的报错,代码如下:
assertThat(service.result) .hasSize(1) // 显式指定入参类型为SearchResponse,编译器可直接识别类属性 .hasOnlyOneElementSatisfying { response: SearchResponse -> assertThat(response.eeId).isEqualTo("same eeId") assertThat(response.personId).isEqualTo(uuid) }
注意:该写法仍然会存在方法废弃的编译警告,长期维护的项目还是建议迁移到
singleElement()系列的新API。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

