JUnit测试中如何Mock ResultMetaData?附使用该类的函数场景
解决Mock ResultSetMetaData并关联ResultSet的问题
别担心,你其实已经走对路了,只是少了关键的一步——把Mock好的ResultSetMetaData关联到你的ResultSet对象上!我来给你一步步讲清楚:
核心问题分析
你的代码里是通过rs.getMetaData()获取ResultSetMetaData的,但你之前只Mock了rsmd,却没让你的Mock ResultSet返回这个rsmd,所以程序运行时拿不到你设置的列名,自然达不到预期效果。
完整的Mock示例代码
// 1. 先Mock ResultSetMetaData对象,设置列名返回值 ResultSetMetaData rsmd = Mockito.mock(ResultSetMetaData.class); // 注意这里的返回值要和你判断的"something"对应,equalsIgnoreCase不区分大小写,所以返回"Something"完全没问题 // 另外检查下你之前的拼写:"Somwthing"是笔误,改成"Something"哦 Mockito.when(rsmd.getColumnName(1)).thenReturn("Something"); // 2. Mock ResultSet对象,让它的getMetaData()返回我们刚才Mock好的rsmd ResultSet rs = Mockito.mock(ResultSet.class); Mockito.when(rs.getMetaData()).thenReturn(rsmd); // 3. 如果你的函数还需要操作ResultSet的其他方法(比如next()),记得也要Mock对应逻辑 // 比如模拟结果集有一行数据: Mockito.when(rs.next()).thenReturn(true); // 4. 现在把这个Mock好的rs传入你的函数测试即可 yourTargetFunction(rs);
额外注意事项
- 数据库列索引是从1开始的,这个你已经用对了,没问题;
- 确保
getColumnName的返回值和你判断的字符串匹配(哪怕大小写不同,因为你用了equalsIgnoreCase); - 如果你的函数里还用到了ResultSetMetaData的其他方法(比如getColumnCount()),也要按需Mock对应的返回值,比如:
Mockito.when(rsmd.getColumnCount()).thenReturn(1);
内容的提问来源于stack exchange,提问作者Akhil Kumar
相关产品推荐
相关产品推荐

