簡體   English   中英

在可分頁控制器上使用WebTestClient

[英]Use WebTestClient on a Pageable Controller

我正在使用Spring Boot 2隨附的反應式網絡測試替代方法,並且我正在嘗試為這樣的控制器構建測試:

@RestController
@RequestMapping("/users")
public class UserController{

    @Autowired
    private UserService service;

    @GetMapping
    public Page<UserDTO> get(Pageable pageable){
        return service.get(pageable);
    }
}

測試如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UsersTest{

    @Autowired
    private WebTestClient webClient;

    @Test
    public void test(){
         List<UserDTO> userList = webClient.get()
            .uri("/users")
            .exchange()
            .expectStatus().isOk()
            .expectBodyList(UserDTO.class).hasSize(1)
            .returnResult()
            .getResponseBody();

        assertNotNull(userList.get(1).getId());
    }
}

請求中的結果實際上是1個元素的列表,但由於響應的結構為:

{
  "content": [
    {
      "id": 1,
      "name": "John",
      "lastName": "Doe",
      "active": true
    }
  ],
  "pageable": {
    "sort": {
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "pageSize": 25,
    "pageNumber": 0,
    "unpaged": false,
    "paged": true
  },
  "totalPages": 1,
  "totalElements": 1,
  "last": true,
  "size": 25,
  "number": 0,
  "numberOfElements": 1,
  "first": true,
  "sort": {
    "sorted": false,
    "unsorted": true
  }
}

因此,當我獲得第一個元素的id值時,我將獲得空值。 測試失敗。

有沒有一種方法(也許是Exchange篩選器功能)可以使WebTestClient理解可分頁的響應?

在此先感謝您的幫助。

我認為WebTestClient可以理解可分頁的響應。 響應的結構為json,而WebTestClient提供了一種與json交互的方式。

因此,如果要測試響應是否包含1個具有ID的用戶。 你可以做:

  webClient.get()
           .uri("/users")
           .exchange()
           .expectBody()
           .jsonPath("$.numberOfElements").isEqualTo(1)
           .jsonPath("$.content[0].id").isNotEmpty();

我認為Dirk Deyne解決方案比我的要好,但是對於某些人來說,它可能是有用的。

我使用lombok構建了這3個類:

@Data
@NoArgsConstructor
public class CustomResponsePage<T> {
    List<T> content;
    CustomPageable pageable;
    Integer totalPages;
    Integer totalElements;
    Boolean last;
    Integer size;
    Integer number;
    Long numberOfElements;
    Boolean first;
    CustomSort sort;
}

@Data
@NoArgsConstructor
public class CustomPageable{
    CustomSort sort;
    Long offset;
    Integer pageSize;
    Integer pageNumber;
    Boolean unpaged;
    Boolean paged;
}

@Data
@NoArgsConstructor
public class CustomSort {
    Boolean sorted;
    Boolean unsorted;
}

然后,我像這樣修改了測試:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UsersTest{

    @Autowired
    private WebTestClient webClient;

    @Test
    public void test(){
         PagedUserDTO pagedUserList = webClient.get()
            .uri("/users")
            .exchange()
            .expectStatus().isOk()
            .expectBody(UserDTO.class)
            .returnResult(PagedUserDTO.class)
            .getResponseBody();

        assertTrue(pagedUserList.getContent().size() == 0);
    }

    private static class PagedUserDTO extends CustomResponsePage<UserDTO> { }
}

注意測試結束時創建的PagedUserDTO類。

這是一個仍在進行中的結構,因為它不考慮響應中何時有訂單列,但就我而言,我不需要它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM