繁体   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