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

Mockito中删除方法测试遇问题,求正确实现方式

Mockito删除方法测试错误分析与修复

错误原因

  1. Optional.deleted()方法不存在:Java标准库的Optional类从未提供过deleted()方法,这是对Optional用法的误解——它仅包含empty()、of()、ofNullable()这类静态方法。
  2. 删除成功场景逻辑错误:测试删除成功时,bookRepository.findById(ID)应返回包含有效Book实例的Optional(即你定义的OPTIONAL_BOOK),因为只有找到目标书籍,控制器才会执行删除操作并返回HttpStatus.OK。你之前试图返回不存在的"deleted" Optional,完全不符合业务逻辑。

正确实现代码

修正后的测试类代码如下:

public class BookControllerTest {
    int ID=2;
    int RELEASE=22;
    String AUTHOR="HOMERO";
    String TITLE="LA ODISEA";
    Book BOOK = new Book();
    Optional<Book> OPTIONAL_BOOK = Optional.of(BOOK);
    List<Review> REVIEW_LIST = new ArrayList<>();
    Optional<Book> OPTIONAL_BOOK_EMPTY = Optional.empty();
    
    @Mock
    private BookRepository bookRepository;
    @InjectMocks
    private BookController bookController;
        
    // 初始化Mockito注解(JUnit5用@BeforeEach,JUnit4用@Before)
    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testDeleteBook() {
        // 模拟:根据ID能找到对应书籍
        Mockito.when(bookRepository.findById(ID)).thenReturn(OPTIONAL_BOOK);
        
        ResponseEntity<Object> httpResponse = bookController.deleteBook(ID);
        
        // 验证返回状态码为OK
        assertEquals(HttpStatus.OK, httpResponse.getStatusCode());
        // 关键验证:确认deleteById方法被调用一次
        Mockito.verify(bookRepository, Mockito.times(1)).deleteById(ID);
    }
    
    @Test
    public void testDeleteBookNotFound() {
        Mockito.when(bookRepository.findById(ID)).thenReturn(OPTIONAL_BOOK_EMPTY);
        ResponseEntity<Object> httpResponse = bookController.deleteBook(ID);
        assertEquals(HttpStatus.NOT_FOUND, httpResponse.getStatusCode());
    }
}

额外说明

  • 必须添加Mockito初始化代码(MockitoAnnotations.openMocks(this)),否则@Mock和@InjectMocks注解无法生效,会引发空指针异常。
  • 删除测试的核心不仅是验证返回状态,还要确认Repository的删除方法被正确调用,这能保证控制器确实触发了删除操作。

内容的提问来源于stack exchange,提问作者Wart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:25:14