无法在Robolectric中使用MatrixCursor.newRow()

时间:2014-02-06 05:05:06

标签: android robolectric

我有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
    }
}

所以,我的问题来自上面的代码:

  1. 如何返回MatrixCursor.RowBuilder的实例?

  2. 是否可以在我尝试时隐藏私有方法 ensureCapacity()在上面?编辑:是的,只是让它在影子类中“公开”。

  3. 对Robolectric来说很新,所以我希望能忽略一些东西?

    编辑:通过在shadow类中公开私有方法来弄清楚如何覆盖私有方法。但是,现在我只是将NPE送到其他地方,因为MatrixCursor的状态似乎根本没有设置?

1 个答案:

答案 0 :(得分:0)

Erich建议我尝试使用Robolectric 2.3-Snapshot构建,所以我做了,确实解决了这个问题。见https://groups.google.com/forum/#!topic/robolectric/I5z5N5NH4Pw

不相关,但现在有两个新问题正在发生在ContentResolver.getType()上,我在这里提交了一个补丁:https://github.com/robolectric/robolectric/pull/954,我仍在使用ContentProvider.openFile()。