Spring Boot使用WebTestClient时负向单元测试全部异常通过问题
问题原因
所有测试意外通过的核心原因是断言逻辑完全没有生效:
- 你在测试代码末尾调用的
.equals("Hii")并不是WebTestClient提供的响应校验API,而是所有Java对象都继承自Object类的原生equals方法,这个方法只会返回一个boolean类型的比较结果,不会触发测试框架的失败判定。 - 实际执行时,这行代码只是拿
expectBody(String.class)返回的BodySpec对象和字符串"Hii"做相等比较,得到false结果后没有任何代码接收、校验这个返回值,相当于你根本没有对响应内容做任何断言,测试自然会无校验直接通过。 - 额外注意:你的测试代码里没有加响应状态码校验,就算接口返回404、500这类错误状态,也不会被检测到。
修复方案
- 把原生
equals调用替换为WebTestClient响应体Spec自带的isEqualTo断言方法,这个方法会真正执行内容校验,不符合预期时直接抛出断言失败异常。 - 补充响应状态码断言,先校验接口返回200成功状态,再校验响应内容,避免接口报错时漏判。
修复后的测试代码示例:
@Test public void test() throws Exception { webTestClient .get() .uri(uriBuilder -> uriBuilder .path("/my-controller/test") .build()) .exchange() // 先校验响应状态为200 OK .expectStatus().isOk() .expectBody(String.class) // 调用WebTestClient自带的isEqualTo方法做内容断言 .isEqualTo("Hii"); }
修复后再运行测试,因为接口实际返回内容是"Hello :)",和预期的"Hii"不符,测试会正常抛出断言失败,符合负向用例的预期表现。
内容的提问来源于stack exchange,提问作者Shubham Garg
相关产品推荐
相关产品推荐

