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

Android MatrixCursor调用addRow后count始终为0,求排查解决

问题:MatrixCursor调用addRow后count始终为0,哪里出错了?

我在为内容提供器编写单元测试时,需要Mock一个Cursor对象,但奇怪的是MatrixCursor的addRow方法无法正常工作。添加行之后,count始终保持为0,请问我忽略了什么?

@Test
fun addCursorTest() {
    val columns: Array<String> = arrayOf(
        "name",
        "age"
    )
    val matrixCursor : Cursor = MatrixCursor(columns).apply {
        addRow(arrayOf("name1", 18))
        addRow(arrayOf("name2", 26))
    }
    println("cursor count = ${matrixCursor.count}") //prints "cursor count = 0"
    assertEquals(2, matrixCursor.count)
}

解决办法

问题出在你将MatrixCursor向上转型为Cursor接口变量后,在部分测试环境(如搭配特定Mock框架或旧版本Robolectric)中,接口方法的调用可能没有正确委托到MatrixCursor的实现逻辑。

你可以通过以下两种方式解决:

1. 直接使用MatrixCursor类型变量

放弃向上转型,保持变量的具体类型,确保调用的是MatrixCursor自身的count实现:

@Test
fun addCursorTest() {
    val columns: Array<String> = arrayOf("name", "age")
    val matrixCursor = MatrixCursor(columns).apply {
        addRow(arrayOf("name1", 18))
        addRow(arrayOf("name2", 26))
    }
    println("cursor count = ${matrixCursor.count}") // 输出2
    assertEquals(2, matrixCursor.count)
}

2. 强制转型后获取count

如果业务逻辑要求必须使用Cursor类型变量,可以在获取count时强制转回MatrixCursor:

@Test
fun addCursorTest() {
    val columns: Array<String> = arrayOf("name", "age")
    val matrixCursor: Cursor = MatrixCursor(columns).apply {
        addRow(arrayOf("name1", 18))
        addRow(arrayOf("name2", 26))
    }
    val actualCount = (matrixCursor as MatrixCursor).count
    println("cursor count = $actualCount") // 输出2
    assertEquals(2, actualCount)
}

另外,也可以尝试先调用matrixCursor.moveToFirst(),虽然标准情况下count与游标位置无关,但部分测试框架可能要求游标处于有效位置才能正确返回行数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:34:56