[英]How to use Spring Pageable object in controller without using Java Data?
[英]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.