响应式Java的JUnit测试报错:预期200 OK,实际404 NOT_FOUND
Spring WebFlux Controller测试404 NOT_FOUND问题解决
问题核心原因
你的测试类与目标控制器类完全同名(均为FluxAndMonoController),导致Spring测试上下文加载时出现Bean注册混淆,没有正确加载实际的控制器组件,因此测试请求/flux时返回404。
而Postman/浏览器访问正常,是因为生产环境的应用上下文不受测试类影响,能正确扫描并注册控制器Bean。
解决方案
1. 重命名测试类并明确指定测试目标控制器
将测试类重命名(比如改为FluxAndMonoControllerTest),同时在@WebFluxTest注解中显式指定要测试的控制器类,确保测试上下文只加载目标Bean:
@WebFluxTest(FluxAndMonoController.class) public class FluxAndMonoControllerTest { @Autowired WebTestClient webTestClient; @Test public void flux_approach1(){ Flux<Integer> integerFlux = webTestClient.get().uri("/flux") .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() .returnResult(Integer.class) .getResponseBody(); StepVerifier.create(integerFlux) .expectSubscription() .expectNext(1) .expectNext(2) .expectNext(3) .expectNext(4) .verifyComplete(); } }
2. 移除冗余注解
无需添加@ExtendWith(SpringExtension.class),因为@WebFluxTest注解已经包含了该扩展的功能,添加后不会解决问题,反而增加冗余代码。
额外验证点
- 如果控制器和测试类不在同一个包下,
@WebFluxTest默认只会扫描测试类所在包的组件,此时必须通过@WebFluxTest(FluxAndMonoController.class)显式指定控制器类,否则测试上下文无法加载到目标控制器。 - 确保项目依赖中
spring-boot-starter-test和spring-boot-starter-webflux版本匹配,避免因依赖版本不一致导致的上下文加载问题。
内容的提问来源于stack exchange,提问作者Kartik Mathur
相关产品推荐
相关产品推荐

