如何使用JUnit和Mockito测试JDBCConnectionException的捕获逻辑
测试实现方案
核心测试思路
你需要分别覆盖正常、异常两个场景的验证:
- 正常保存场景:验证
orderStatusRepository.save方法被正确调用,业务逻辑按预期执行,无异常抛出 - 异常场景:通过Mock让
save方法抛出你指定的JDBCConnectionException,验证异常被你的catch块正确捕获,对应异常处理逻辑正常执行
完整测试代码示例
以下是基于JUnit 5 + Mockito的实现代码:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.jdbc.support.JDBCConnectionException; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; // 如果你用JUnit 4,替换为@RunWith(MockitoJUnitRunner.class) @ExtendWith(MockitoExtension.class) public class OrderServiceTest { // 替换为你自己的业务类,即包含保存+异常捕获逻辑的类 @InjectMocks private OrderService orderService; // Mock JPA仓库实例 @Mock private OrderStatusRepository orderStatusRepository; // 测试用例1:正常保存场景 @Test void testSaveOrderStatus_Success() { // 构造测试数据 OrderStatus testOrderStatus = new OrderStatus(); // 调用业务方法 orderService.saveOrderStatus(testOrderStatus); // 验证save方法被调用1次,参数正确 verify(orderStatusRepository, times(1)).save(eq(testOrderStatus)); } // 测试用例2:JDBC连接异常捕获场景 @Test void testSaveOrderStatus_JDBCExceptionHandled() { OrderStatus testOrderStatus = new OrderStatus(); // 配置Mock行为:调用save方法时抛出JDBC连接异常 doThrow(new JDBCConnectionException("模拟数据库连接失败", null)) .when(orderStatusRepository).save(eq(testOrderStatus)); // 执行业务方法,不会向外抛出异常,因为已经被内部catch块捕获 orderService.saveOrderStatus(testOrderStatus); // 验证save方法确实被触发 verify(orderStatusRepository, times(1)).save(eq(testOrderStatus)); // 如果catch块内有自定义逻辑,比如日志打印、返回错误码、触发回滚等,在此处补充对应验证 // 例:如果catch块返回false,可断言 assertEquals(false, 业务方法返回值); } }
注意事项
- 请替换代码中的
OrderService、OrderStatusRepository、saveOrderStatus为你实际的业务类、仓库类、业务方法名 - 确认你捕获的
JDBCConnectionException的包路径和Mock抛出的异常包路径完全一致,否则异常类型不匹配会跳过你的catch块,导致测试失败 - 如果你的catch块内有具体的处理逻辑,一定要补充对应的断言或者验证逻辑,确保异常分支的行为符合预期
内容的提问来源于stack exchange,提问作者t thog
相关产品推荐
相关产品推荐

