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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:15:07