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

