У нас есть тестовый класс 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);
}
Позже, в наших тестах, при вызове следующего кода мы получаем NullPointerException
:
Cursor mCursor = mResolver.query(Uri.parse(mUri), null, null, null, null);
Мы получим тот же результат, даже если подождем создания экземпляра MockContentResolver
, пока у нас не будет копии тестируемой активности:
mActivity = getActivity();
MockContentResolver mResolver = new MockContentResolver(mActivity);
Мы проверили, что mActivity
не равно нулю.
Коллега изучил исходный код Android (не установленный в нашей системе) и обнаружил, что непосредственная причина ошибки заключается в том, что getContext()
возвращает null в первая строка ContentProvider.enforceReadPermissionInner ().
Мы рассмотрели этот вопрос, который изначально казался похожим, но я думаю, была совсем другая проблема. Этот вопрос также является похожим симптомом проблемы, но они не создать экземпляр их 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)
at android.content.ContentResolver.query(ContentResolver.java:461)
at android.content.ContentResolver.query(ContentResolver.java:404)
at packagename.test.FooActivityTest.getNumCommentsForRecipient(FooActivityTest.java:84)
at packagename.test.FooActivityTest.testCommentEntryInternal(FooActivityTest.java:91)
at packagename.test.FooActivityTest.testCommentEntry1(FooActivityTest.java:108)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.access$000(InstrumentationTestCase.java:36)
at android.test.InstrumentationTestCase$2.run(InstrumentationTestCase.java:189)
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1719)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4998)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
at dalvik.system.NativeStart.main(Native Method)
Как мы можем решить эту проблему?