You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:10:28