簡體   English   中英

MockHttpServletResponse 沒有返回模擬列表

[英]MockHttpServletResponse is not returning mocked list

我正在嘗試測試一個簡單的 controller mocking 的服務結果。 為此,我正在使用 Mockito 的when().thenReturn()方法返回一個新數組。 它確實適用於斷言 OK 狀態和返回數組大小,問題是該數組中的對象是空的,所以我不能斷言它們具有某些值。

具體來說, MockHttpServletResponse響應正文是[{},{},{}]和斷言錯誤java.lang.AssertionError: No value at JSON path "$[0].id"

這是一個非常基本的案例,但我需要對服務返回的數組進行一些轉換,所以我需要模擬它們的值以測試它們。

可以嘲笑他們嗎? 我究竟做錯了什么? 謝謝。

這是測試的代碼:

@ExtendWith(SpringExtension.class)
@WebMvcTest(BookController.class)
public class BookControllerTest {

    @Autowired
    MockMvc mockMvc;

    @MockBean
    private BookService bookService;

    @Test
    void getAllBooks() throws Exception {
        List<Book> books = new ArrayList<>();
        books.add(new Book(1L, "Book 1", "Author 1", "Description 1"));
        books.add(new Book(2L, "Book 2", "Author 2", "Description 2"));
        books.add(new Book(3L, "Book 3", "Author 3", "Description 3"));
        when(bookService.getAllBooks()).thenReturn(books);

        mockMvc.perform(MockMvcRequestBuilders.get(Urls.BOOK_URL)
                .contentType(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(3)))
                .andExpect(jsonPath("$[0].id").value(1L));
    }
}

實際 controller:

@RestController
@RequestMapping(Urls.BOOK_URL)
public class BookController {

    private final BookService bookService;

    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    @GetMapping
    public List<Book> getAllBooks() {
        return bookService.getAllBooks();
    }

}

和基本實體:

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String author;
    private String description;
}

它實際上確實返回了您的列表,這通過大小 3 的斷言沒有失敗是顯而易見的。 問題是您的Book class 沒有 getter 和 setter,而創建 JSON 需要這些(或至少是 getter)。

當您使用 Lombok 時,將@Getters@Setters添加到 class 以生成它們。

暫無
暫無

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

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