我有ContentProvider
试图致电matrixCursor.newRow()
。私有方法NullPointerException
中的MatrixCursor.ensureCapacity()
崩溃了。调试到这个,我看到matrixCursor.data
为空(看起来ShadowMatrixCursor没有在构造函数中实例化它。)
我正在使用最新的Robolectric jar 2.2版。
@RunWith(RobolectricTestRunner.class)
public class MatrixCursorTest {
@Test
public void thisCrashesInNewRow() {
MatrixCursor c = new MatrixCursor(new String[] { "test", "cols" }, 1);
MatrixCursor.RowBuilder b = c.newRow(); // This crashes with NPE
}
}
我正在努力了解如何解决这个问题。我尝试创建“MyShadowMatrixCursor”,如下所示,但我只是没有看到我如何覆盖newRow()的行为只是简单地返回一个空的RowBuilder(其构造函数是默认的/ package-private,因此我无法访问阴影。)
import android.database.MatrixCursor;
import android.database.MatrixCursor.RowBuilder;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
@Implements(value = MatrixCursor.class, inheritImplementationMethods = true)
public class MyShadowMatrixCursor extends org.robolectric.shadows.ShadowMatrixCursor {
@RealObject
private MatrixCursor cursor;
@Implementation
public RowBuilder newRow() {
// this causes infinite loop because shadow intercepts it again:
return cursor.newRow();
// doesn't work because RowBuilder constructor is package-private
...return cursor.new RowBuilder()
// how can i return an instance of MatrixCursor.RowBuilder instead?
}
@Implementation
public void ensureCapacity(int i) {
// Override the private ensureCapacity
// do nothing
}
}
所以,我的问题来自上面的代码:
如何返回MatrixCursor.RowBuilder的实例?
是否可以在我尝试时隐藏私有方法 ensureCapacity()在上面?编辑:是的,只是让它在影子类中“公开”。
对Robolectric来说很新,所以我希望能忽略一些东西?
编辑:通过在shadow类中公开私有方法来弄清楚如何覆盖私有方法。但是,现在我只是将NPE送到其他地方,因为MatrixCursor的状态似乎根本没有设置?
答案 0 :(得分:0)
不相关,但现在有两个新问题正在发生在ContentResolver.getType()上,我在这里提交了一个补丁:https://github.com/robolectric/robolectric/pull/954,我仍在使用ContentProvider.openFile()。