首页 > 解决方案 > Spring boot:使用 TestRestTemplate 测试分页结果

问题描述

我有一个资源 A,它有一个控制器,其中包含一个用于检索分页 A 项目的端点:

      public ResponseEntity getAllAs(
      @PageableDefault(size = 25, value = 0) Pageable pageable) {
        Page<A> pagedAs = .....
        return ResponseEntity.ok(pagedAs);
  }

当我尝试创建集成测试并使用 TestRestTemplate 调用此端点时,我遇到了问题,因为Page无法实例化对象。

这是电话:

    ResponseEntity<Page> response =  template.getForEntity("/api/as,
            Page.class );

这是一个例外:

  com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.data.domain.Page` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (PushbackInputStream); line: 1, column: 1]

Page我想这对于无法实例化的事实是正常的,但这限制了使用 spring boot 分页结果时的可测试性。

标签: javaspringintegration-testingspring-restcontrollerspring-rest

解决方案


将控制器的响应从 更改Page<T>List<T>

public ResponseEntity getAllAs(
       @PageableDefault(size = 25, value = 0) Pageable pageable) {
       Page < A > pagedAs = .....
       return ResponseEntity.ok(pagedAs);
   }

然后将您使用 API 的位置从 List 转换为 Page

Page<T> page = new PageImpl<>(list);

推荐阅读