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

如何解决Mock ResultSet.getUninterruptibly时出现的NPE问题

解决JUnit5测试DAO异步调用的空指针异常问题

问题根源

你测试代码里只mock了session.executeAsync(any(BoundStatement.class)),但实际业务代码中传入executeAsync的是BatchStatement对象,导致mock方法未匹配,返回null,调用getUninterruptibly时触发空指针异常。

修复方案

  1. 调整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);
    
  2. 确保所有依赖实例已正确初始化
    检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:08:12