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

使用Mockito模拟Date时触发空指针异常,附代码求解决方案

问题排查与修复方案

核心问题点

  • DateFormat初始化错误:测试类里创建SimpleDateFormat时传入了日期字符串"2017-08-19 12:20:55",但构造方法需要的是格式模板(比如被测试代码里的"yyyy-mm-dd hh:mm:ss"),这会导致DateFormat实例异常。
  • ResultSet.getDate()未模拟返回值:没有对resultSet.getDate(RECORDDATE)进行mock,调用时会返回null,进而触发df.format(null)的空指针异常。
  • Mockito使用错误:测试类里mock的是自己创建的df实例的format方法,但被测试代码里的df是mapRow方法内部新建的对象,两者不是同一个实例,这个mock完全无效。

修正后的测试类代码

@Test
public void mapRowTest() throws SQLException, ParseException {
    // 模拟ResultSet
    ResultSet resultSet = mock(ResultSet.class);
    Mockito.when(resultSet.getLong(RESOURCEID)).thenReturn(12345L);
    
    // 构造测试用的Date对象并转换为sql.Date
    Date testDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-19 12:20:55");
    Mockito.when(resultSet.getDate(RECORDDATE)).thenReturn(new java.sql.Date(testDate.getTime()));
    
    // 执行测试方法
    EventData result = eventMapper.mapRow(resultSet, 1);
    
    // 添加断言验证结果
    assertEquals(12345L, result.getResourceId());
    assertEquals("2017-08-19 12:20:55", result.getrecordDate());
}

额外优化建议

  • 修正日期格式模板:被测试代码里的"yyyy-mm-dd hh:mm:ss"存在错误,mm代表分钟,月份需用MM;hh是12小时制,如需24小时制请替换为HH,避免格式转换偏差。
  • 推荐使用Java 8+的java.timeAPI:比如DateTimeFormatter替代SimpleDateFormat,前者线程安全,能避免潜在的并发问题。
  • 必须添加断言:测试中通过断言验证返回的EventData属性值,确保测试用例能有效验证业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:15:36