小编cta*_*mor的帖子

使用MockContentResolver进行查询会导致NullPointerException

我们有一个扩展的JUnit测试类ActivityInstrumentationTestCase2<CommentActivity>.测试(以及我们正在测试的类)使用CommentContentProvider扩展ContentProvider来访问SQLite数据库,并且NullPointerException在提供程序上运行查询时,我们得到了[下面的完整堆栈跟踪].

我们实例化一个MockContentResolver,如下所示:

MockContentResolver mResolver;

public void setUp() {
    super.setUp();
    CommentContentProvider ccp = new CommentContentProvider();
    mResolver = new MockContentResolver();
    mResolver.addProvider(CommentContentProvider.AUTHORITY, ccp);
}
Run Code Online (Sandbox Code Playgroud)

稍后,在我们的测试中,当调用以下代码时,我们得到一个NullPointerException:

Cursor mCursor = mResolver.query(Uri.parse(mUri), null, null, null, null);
Run Code Online (Sandbox Code Playgroud)

即使我们等待实例化,MockContentResolver直到我们有一个被测活动的副本,我们也会得到相同的结果:

mActivity = getActivity();
MockContentResolver mResolver = new MockContentResolver(mActivity);
Run Code Online (Sandbox Code Playgroud)

我们已经确认mActivity不是空的.

一位同事介入Android源代码(未安装在我们的系统上),发现错误的最直接原因是在ContentProvider.enforceReadPermissionInner()getContext()第一行返回null .

我们看了一下这个看起来很相似的问题,但我认为这完全是一个不同的问题. 这个问题也是问题的类似症状,但他们没有实例化他们的问题MockContentResolver.我们在实例化我们时遇到了问题.

这是我们得到的堆栈跟踪:

java.lang.NullPointerException
at android.content.ContentProvider$Transport.enforceReadPermissionInner(ContentProvider.java:449)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394)
at android.content.ContentProvider$Transport.query(ContentProvider.java:194) …
Run Code Online (Sandbox Code Playgroud)

android nullpointerexception android-contentresolver android-contentprovider

5
推荐指数
1
解决办法
1520
查看次数