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

Android-MockitoJUnitRunner:Cursor的getCount方法始终返回0求助

解决Mockito结合Cursor时getCount()始终返回0的问题

嘿,我之前也踩过这个坑,咱们来一步步拆解问题所在:

首先,你遇到的核心问题大概率是Mockito的mock对象和你实际操作的MatrixCursor完全是两个独立的实例——如果你的单元测试里先通过Mockito创建了Cursor的mock,然后又单独实例化了MatrixCursor并强制转换,那mock的Cursor根本不知道你给MatrixCursor加了行数据,调用它的getCount()自然会返回默认的0。

给你两种可行的解决方案:

方案1:直接使用真实的MatrixCursor(推荐)

MatrixCursor本身就是Android提供的可操作的Cursor实现,完全可以直接在单元测试中使用,不需要额外mock:

// 直接创建MatrixCursor实例,无需Mockito mock
final MatrixCursor cursor = new MatrixCursor(new String[]{"ID", "name", "data"});
cursor.addRow(new Object[]{1, "myName", "myData"});

// 此时调用cursor.getCount()会正确返回1

方案2:用Mockito Spy包装真实的MatrixCursor

如果你确实需要mock Cursor的某些方法(比如避免触发真实数据库的其他逻辑),可以用Mockito的Spy功能,它会保留真实对象的大部分行为,同时允许你mock特定方法:

// 先创建真实的MatrixCursor并添加数据
MatrixCursor realCursor = new MatrixCursor(new String[]{"ID", "name", "data"});
realCursor.addRow(new Object[]{1, "myName", "myData"});

// 创建Spy对象,包装真实的MatrixCursor
Cursor cursorSpy = Mockito.spy(realCursor);

// 此时调用cursorSpy.getCount()会返回真实的计数1
// 如果需要mock其他方法,比如moveToFirst(),可以这样打桩:
Mockito.when(cursorSpy.moveToFirst()).thenReturn(true);

为什么你的原代码会失效?

如果你的测试代码里是先mock了Cursor cursor = Mockito.mock(Cursor.class);,然后又强制转换成MatrixCursor去加行,那这个强制转换其实是不安全的(mock对象并不是真正的MatrixCursor实例),你添加行的操作根本没有作用在mock的Cursor上,所以getCount()自然返回0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:02