我嘗試為我的 Spring 引導控制器撰寫集成測驗。這是我要測驗的控制器方法:
@GetMapping("/")
public String getAllBooks(Model model, @RequestParam("page") Optional<Integer> page, @RequestParam("size") Optional<Integer> size) {
int currentPage = page.orElse(FIRST_PAGE);
int pageSize = size.orElse(DEFAULT_PAGE_SIZE);
Page<Book> bookPage = bookService.getAllBooks(PageRequest.of(currentPage - 1, pageSize));
Set<String> categories = bookService.findAllCategories();
model.addAttribute("categories", categories);
model.addAttribute("currentPage", currentPage);
model.addAttribute("books", bookPage);
int totalPages = bookPage.getTotalPages();
if (totalPages > 0) {
List<Integer> pageNumbers = IntStream.rangeClosed(1, totalPages)
.boxed()
.collect(Collectors.toList());
model.addAttribute("pageNumbers", pageNumbers);
}
return "library";
}
這是我的測驗課:
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTests {
@Autowired
private MockMvc mockMvc;
@Mock
BookService bookService;
@Mock
BookRepository bookRepository;
private final String category = "forTest";
final Book book = new Book("test1", 9999, "testAuthor1", 1, "test1");
@BeforeEach
public void initEach() {
bookService.addNewBook(book, category, "not used");
}
@AfterEach
public void deleteEach() {
bookRepository.deleteAll();
}
@Test
void getAllBooksTest() throws Exception {
mockMvc.perform(get("/")
.param("page", "1")
.param("size", "20"))
.andExpect(status().isOk());
ArgumentCaptor<Pageable> pageableCaptor = ArgumentCaptor.forClass(Pageable.class);
verify(bookRepository).findAll(pageableCaptor.capture());
PageRequest pageable = (PageRequest) pageableCaptor.getValue();
assertThat(pageable).hasPageNumber(1);
assertThat(pageable).hasPageSize(20);
}
}
我撰寫了自定義 assertThat 方法,如下所示:
class PageableAssert extends AbstractAssert<PageableAssert, Pageable> {
PageableAssert(Pageable pageable) {
super(pageable, PageableAssert.class);
}
static PageableAssert assertThat(Pageable actual) {
return new PageableAssert(actual);
}
void hasPageSize(int expectedPageSize) {
if (!Objects.equals(actual.getPageSize(), expectedPageSize)) {
failWithMessage("expected page size to be <%s> but was <%s>", expectedPageSize, actual.getPageSize());
}
}
void hasPageNumber(int expectedPageNumber) {
if (!Objects.equals(actual.getPageNumber(), expectedPageNumber)) {
failWithMessage("expected page number to be <%s> but was <%s>", expectedPageNumber, actual.getPageNumber());
}
}
PageableAssert hasSort(String field, Sort.Direction direction) {
Sort.Order actualOrder = actual.getSort().getOrderFor(field);
if (actualOrder == null) {
failWithMessage("expected sort for field <%s> to be <%s> but was null", field, direction);
} else if (actualOrder.getDirection() != direction) {
failWithMessage("expected sort for field <%s> to be <%s> but was <%s>", field, direction, actualOrder.getDirection());
}
return this;
}
}
但正如我正確理解我的問題出現在這一行:
verify(bookRepository).findAll(pageableCaptor.capture());
所以我的自定義斷言不能影響這個錯誤的發生,看起來像:
想要但未呼叫:bookRepository.findAll(); -> 在 kpi.diploma.ovcharenko.controller.BookControllerTests.getAllBooksTest(BookControllerTests.java:58) 實際上,與此模擬的互動為零。
你能幫我解決這個問題嗎,因為我完全不知道如何解決它。
uj5u.com熱心網友回復:
在您的測驗中,您正在驗證是否bookRepository.findAll已呼叫,但在您正在測驗的方法中,甚至沒有參考 bookRepository。
您要驗證的是bookService.getAllBooks并且bookService.findAllCategories正在被呼叫。
如果您想驗證您的 bookRepository 呼叫是否被正確呼叫,請圍繞 bookService 方法撰寫一個測驗,因為我假設這是進行這些呼叫的地方。
另外,我應該補充一點,由于您的測驗方法使用來自這些模擬的回應,您需要創建一個 when()->then() 陳述句以確保這些呼叫回傳一些資料,否則您將得到一個 null到達這一行時的指標例外:int totalPages = bookPage.getTotalPages();
就像是,
Page<Book> bookPage = Mockito.mock(Page.class);
when(bookService.getAllBooks(any()).thenReturn(bookPage);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/494261.html
