如何对入参包含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
相关产品推荐
相关产品推荐

