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

