使用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
相关产品推荐
相关产品推荐

