@WebFluxTest测试控制器遇Pageable解析异常,如何注册对应Resolver?
解决@WebFluxTest测试Pageable参数时的构造器异常问题
问题原因
@WebFluxTest注解默认不会自动注册Spring Data的ReactivePageableHandlerMethodArgumentResolver,导致控制器方法中的Pageable参数无法被解析,抛出No primary or default constructor found for interface org.springframework.data.domain.Pageable异常。
解决方案
方案一:导入Spring Data Reactive配置类
直接导入ReactiveDataWebConfiguration,这个类会自动注册所有Spring Data Reactive相关的参数解析器(包括分页解析器),无需手动配置:
@WebFluxTest({MyController.class}) @Import(ReactiveDataWebConfiguration.class) // 导入配置类自动注册分页解析器 class MyControllerTest { @MockBean private MyService myService; @Autowired private WebTestClient client; @Test void myTest() { List<Integer> list = List.of(1,2,3); Page<Integer> expected = new PageImpl<>(list); // 注意:mock方法要和控制器调用的service方法对应(原代码里的method改为search) when(myService.search( any(Pageable.class), anyString() )).thenReturn(Mono.just(expected)); client.get() .uri("/path?arg=test&page=0&size=10") // 可添加分页参数验证解析逻辑 .exchange() .expectStatus() .isOk(); } }
方案二:手动配置WebTestClient添加分页解析器
如果只需要注册特定的解析器,可手动构建WebTestClient并添加ReactivePageableHandlerMethodArgumentResolver:
@WebFluxTest({MyController.class}) class MyControllerTest { @MockBean private MyService myService; private WebTestClient client; @Autowired void setUp(WebTestClient.Builder builder) { ReactivePageableHandlerMethodArgumentResolver pageableResolver = new ReactivePageableHandlerMethodArgumentResolver(); this.client = builder .configureClient() .argumentResolvers(configurer -> configurer.addCustomResolver(pageableResolver)) .build(); } @Test void myTest() { List<Integer> list = List.of(1,2,3); Page<Integer> expected = new PageImpl<>(list); when(myService.search( any(Pageable.class), anyString() )).thenReturn(Mono.just(expected)); client.get() .uri("/path?arg=test&page=0&size=10") .exchange() .expectStatus() .isOk(); } }
额外注意点
- 确保测试中mock的service方法名与控制器实际调用的方法一致(原测试代码中
myService.method需改为myService.search,否则mock不会生效) - 测试请求中可添加
page、size等分页参数,验证参数解析是否正常工作
内容的提问来源于stack exchange,提问作者Ticistrac
相关产品推荐
相关产品推荐

