Mockito中删除方法测试遇问题,求正确实现方式
Mockito删除方法测试错误分析与修复
错误原因
Optional.deleted()方法不存在:Java标准库的Optional类从未提供过deleted()方法,这是对Optional用法的误解——它仅包含empty()、of()、ofNullable()这类静态方法。- 删除成功场景逻辑错误:测试删除成功时,
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
相关产品推荐
相关产品推荐

