如何解决Mock ResultSet.getUninterruptibly时出现的NPE问题
解决JUnit5测试DAO异步调用的空指针异常问题
问题根源
你测试代码里只mock了session.executeAsync(any(BoundStatement.class)),但实际业务代码中传入executeAsync的是BatchStatement对象,导致mock方法未匹配,返回null,调用getUninterruptibly时触发空指针异常。
修复方案
调整mock的参数匹配器
将针对BoundStatement的mock改为匹配BatchStatement,或者更通用的Statement(因为两者都继承自Cassandra的Statement接口),确保mock能命中实际调用:// 替换原来的BoundStatement匹配 Mockito.when(session.executeAsync(any(BatchStatement.class))).thenReturn(resultSetFuture); // 或者用更通用的Statement匹配,兼容更多场景 // Mockito.when(session.executeAsync(any(Statement.class))).thenReturn(resultSetFuture);确保所有依赖实例已正确初始化
检查cassandraSuppSession、session、resultSetFuture、resultSet这些mock对象是否已经通过@Mock注解或Mockito.mock()方法创建实例,避免这些对象本身为null。比如测试类顶部应该有:@Mock private CassandraSuppSession cassandraSuppSession; @Mock private Session session; @Mock private ResultSetFuture resultSetFuture; @Mock private ResultSet resultSet; // 其他需要的mock对象同理
修改后的测试代码片段
调整mock部分后的测试方法:
void saveObject() throws ParseException, TimeoutException, ExecutionException, InterruptedException { Object rec16 = getRec16_3(); Mockito.when(cassandraSession.getOrCreateStatement(any(String.class))) .thenReturn(preparedStatement); Mockito.when(preparedStatement.bind()).thenReturn(boundStatement); Mockito.when(boundStatement.setString(anyInt(), any(String.class))).thenReturn(boundStatement); Mockito.when(boundStatement.setTimestamp(anyInt(), any(Date.class))).thenReturn(boundStatement); Mockito.when(boundStatement.setLong(anyInt(), anyLong())).thenReturn(boundStatement); Mockito.when(boundStatement.setDouble(anyInt(), any(Double.class))).thenReturn(boundStatement); Mockito.when(boundStatement.setInt(anyInt(), anyInt())).thenReturn(boundStatement); Mockito.when(cassandraSuppSession.getCassandraSession()).thenReturn(session); // 关键修改:匹配BatchStatement Mockito.when(session.executeAsync(any(BatchStatement.class))).thenReturn(resultSetFuture); Mockito.when(resultSetFuture.getUninterruptibly(anyLong(), any(TimeUnit.class))).thenReturn(resultSet); objectDao.saveObject(rec16); }
内容的提问来源于stack exchange,提问作者Cris Manrique
相关产品推荐
相关产品推荐

