如何测试带有HATEOAS链接的Spring Boot RestController单元测试?
问题:为包含HATEOAS链接的Spring Boot RestController编写单元测试
我正在Coursera学习亚马逊初级软件开发人员认证课程,目前在完成Spring Boot API相关内容的实验。现在需要为一个使用HATEOAS链接的RestController编写单元测试,但不想对原方法做完全重构。
我之前尝试在测试代码里重构原Controller的逻辑,但测试失败了——因为预期和实际返回的对象引用不同,直接用assertEquals对比整个ResponseEntity会不通过。
我还试过用assertTrue(entity.hasLink("self"))这类方式校验链接,同样失败了。
实验要求里没提到要使用Mock MVC或Mockito,所以我需要写简单的单元测试。请问有什么合适的方法?
我的测试代码:
@Test void getBookByIdTest(){ long nullId = 100L; assertEquals(ResponseEntity.status(HttpStatus.NOT_FOUND).body("Error: Book with ID 100 not found."),bookController.getBookById(nullId)); String baseURL = testRestTemplate.getRootUri(); // Available long availableId = 1L; Book bookAvailable = bookService.findBookById(availableId); EntityModel<Book> availEntity = EntityModel.of(bookAvailable); availEntity.add(linkTo(methodOn(BookController.class).getBookById(availableId)).withSelfRel()); availEntity.add(linkTo(methodOn(BookController.class).borrowBook(availableId)).withRel("borrow")); assertEquals(ResponseEntity.ok(availEntity),bookController.getBookById(1)); // Unavailable long unavailableId = 2L; Book bookUnavailable = bookService.findBookById(unavailableId); EntityModel<Book> unavailEntity = EntityModel.of(bookUnavailable); unavailEntity.add(linkTo(methodOn(BookController.class).getBookById(unavailableId)).withSelfRel()); unavailEntity.add(linkTo(methodOn(BookController.class).returnBook(unavailableId)).withRel("return")); assertEquals(ResponseEntity.ok(unavailEntity),bookController.getBookById(2)); }
要测试的Controller方法:
@GetMapping("/{id}") public ResponseEntity<?> getBookById(@PathVariable long id) { Book foundBook = bookService.findBookById(id); if (foundBook == null) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Error: Book with ID " + id + " not found."); } EntityModel<Book> resource = EntityModel.of(foundBook); resource.add( linkTo( methodOn(BookController.class).getBookById(id)). withSelfRel()); if (foundBook.isAvailable()) { resource.add( linkTo( methodOn(BookController.class).borrowBook(id)). withRel("borrow")); } else { resource.add( linkTo( methodOn(BookController.class).returnBook(id)). withRel("return")); } return ResponseEntity.ok(resource); }
内容的提问来源于stack exchange,提问作者Joseph Loomis
相关产品推荐
相关产品推荐

