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

如何对入参包含ResultSet回调的jdbcTemplate.query()方法进行mock

测试实现方案

你可以使用Mockito框架完成JdbcTemplate的Mock测试,具体操作步骤如下:

前置依赖

如果使用Spring Boot项目,直接引入spring-boot-starter-test即可,其中已经内置了Mockito相关依赖;普通项目可单独引入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.core.JdbcTemplate;
import java.sql.ResultSet;
import java.sql.SQLException;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

@ExtendWith(MockitoExtension.class)
public class YourServiceTest {
    // Mock JdbcTemplate对象
    @Mock
    private JdbcTemplate jdbcTemplate;

    // 把Mock好的JdbcTemplate注入到你要测试的业务类中
    @InjectMocks
    private YourService yourService; // 替换为实际的业务类类名

    @Test
    public void testJdbcQuery() throws SQLException {
        // 1. 构造预期返回的Info模拟数据
        Info expectedInfo = new Info();
        expectedInfo.setName("测试姓名");
        expectedInfo.setId(1001);
        expectedInfo.setNo("NO2024001");

        // 2. 定义JdbcTemplate.query方法的Mock行为
        when(jdbcTemplate.query(
                anyString(), // 匹配任意SQL,也可以替换为eq("你的实际SQL")做精确匹配
                any(Object[].class), // 匹配任意参数数组,也可替换为eq(new Object[]{对应number值})做精确校验
                any() // 匹配ResultSetExtractor实现类
        )).thenReturn(expectedInfo);

        // 3. 调用业务方法获取结果
        Info actualInfo = yourService.yourBusinessMethod("你要传的number参数"); // 替换为实际业务方法名和参数

        // 4. 断言结果符合预期
        assertNotNull(actualInfo);
        assertEquals(expectedInfo.getName(), actualInfo.getName());
        assertEquals(expectedInfo.getId(), actualInfo.getId());
        assertEquals(expectedInfo.getNo(), actualInfo.getNo());

        // 5. 校验query方法确实被调用了1次
        verify(jdbcTemplate, times(1)).query(anyString(), any(Object[].class), any());
    }

    // 可选:单独测试ResultSet映射逻辑,覆盖边界场景
    @Test
    public void testResultSetMapping() throws SQLException {
        ResultSet mockRs = mock(ResultSet.class);
        // 模拟返回单条数据的场景
        when(mockRs.next()).thenReturn(true);
        when(mockRs.getString(1)).thenReturn("测试姓名");
        when(mockRs.getInt(2)).thenReturn(1001);
        when(mockRs.getString(3)).thenReturn("NO2024001");

        // 手动执行映射逻辑校验
        Info info = new Info();
        info.setName(mockRs.getString(1));
        info.setId(mockRs.getInt(2));
        info.setNo(mockRs.getString(3));

        assertEquals("测试姓名", info.getName());
        assertEquals(1001, info.getId());
        assertEquals("NO2024001", info.getNo());

        // 可补充测试rs.next()返回false的空结果场景
    }
}

注意事项

  • 你贴出的代码存在笔误:变量声明为Info prf,但返回的是perf,实际运行会报错,建议提前修正。
  • 如果需要严格校验参数传递是否正确,可以把参数匹配器的any*替换为eq(实际值)做精确匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 23:03:00