测试Spring Data JPA方法时thenReturn()该用null还是Optional.empty()?
Spring Data JPA Optional返回类型单元测试规范答疑
明确结论:thenReturn(Optional.empty())是唯一符合规范的实现方式,绝对不建议返回null,原因如下:
- 符合Spring Data JPA的真实运行逻辑:只要你定义的Repository方法返回类型是
Optional<T>,Spring Data JPA的底层实现会自动把查询不到结果的情况封装为Optional.empty()返回,永远不会返回null。你在单元测试中返回null完全模拟不了真实线上的运行场景,反而会制造出线上不会出现的虚假报错。 - 符合Optional的设计约定:Java引入
Optional的核心目的就是为了避免返回值为null导致的空指针异常,行业通用约定所有返回Optional类型的方法都不应该返回null,否则就完全违背了Optional的设计初衷。 - 避免测试逻辑和业务逻辑脱节:比如业务代码中如果直接对返回值调用
Optional的实例方法(比如ifPresent()、orElse()等),如果你mock返回null,单元测试会直接抛出空指针异常,但这个异常在线上永远不会出现,只会浪费你的排查时间,也起不到验证业务逻辑的作用。
举个反例,假设你的业务代码如下:
demoRepository.findByUuid(uuid).ifPresent(country -> { // 业务逻辑处理 });
如果你mock的时候写thenReturn(null),运行单元测试会直接在这一行抛出NullPointerException,但真实运行环境下这段代码永远不会触发空指针,属于完全无效的测试结果。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

