You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试带有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:55:15