如何用Mockito编写JUnit测试覆盖删除操作的异常分支?
如何覆盖deleteByNoteCd方法的异常分支测试
要覆盖catch分支,核心是让userNoteDefRepository.deleteById(noteCd)抛出异常,触发try-catch的异常逻辑。按以下步骤调整你的JUnit测试:
1. 确保测试类的依赖Mock配置正确
首先,你的测试类需要正确MockuserNoteDefRepository和loggingService,并注入到待测试的service实例中:
@ExtendWith(MockitoExtension.class) public class ClientRequestServiceTest { @Mock private UserNoteDefRepository userNoteDefRepository; @Mock private LoggingService loggingService; @InjectMocks private ClientRequestService service; // 你的待测试服务类 }
2. 编写异常分支的测试方法
新增一个专门测试异常场景的方法,通过Mockito强制让deleteById抛出异常:
@Test public void deleteByNoteCd_WhenDeleteFails_ReturnsErrorResponse() { // 构造测试参数 LogDTO log = new LogDTO(); UserNoteDefination request = new UserNoteDefination(); request.setTabName("UND_TABLE"); request.setNoteCd("TEST7"); // 配置Mock:让deleteById抛出异常 doThrow(new RuntimeException("模拟删除失败")).when(userNoteDefRepository).deleteById("TEST7"); // 调用待测试方法 UserNoteDefination response = service.deleteByNoteCd(request, log); // 验证结果 assertEquals("Error", response.getMsg()); assertEquals("[FROM:UI] clientRequest:Error occured while delete", log.getPayload()); // 验证日志服务是否按预期调用 verify(loggingService).log(GuiServiceConstants.ERROR_LEVEL, log); }
关键说明
doThrow用于配置Mock对象的方法抛出指定异常,这里针对deleteById("TEST7")触发异常,你也可以用anyString()匹配任意传入的noteCd。- 验证环节不仅要检查响应的msg是否为"Error",还要验证log的payload是否正确,以及
loggingService是否以ERROR级别记录了日志,确保整个异常分支的逻辑都被执行。 - 原测试只覆盖了正常流程,新增这个测试后就能覆盖catch分支的代码了。
内容的提问来源于stack exchange,提问作者Queen Cr
相关产品推荐
相关产品推荐

