ProviderTestCase2.getProvider()为null

Che*_*rra 5 android unit-testing android-contentprovider

我正在尝试测试ContentProvider类,但无法使其工作.

getProvider()继续返回null,但正如我从ProviderTestCase2.setUp()代码中理解的那样,它不应该.

public class NotesProviderTest extends ProviderTestCase2<NotesProvider>
{
    ...

    public NotesProviderTest()
    {
        super(NotesProvider.class, Contract.AUTHORITY);
    }

    @Override
    protected void setUp() throws Exception
    {
        super.setUp();

    }

    public void testNoteProvider__inserts_a_valid_record() throws Exception
    {
        Note note = new Note(new JSONObject(simpleNoteJson));

        NotesProvider provider = getProvider();

        Uri insert = provider.insert(Note.URI, note.getContentValues());
        assertEquals(1L, ContentUris.parseId(insert));

        Cursor cursor = provider.query(Note.URI, null, null, new String[]{}, null);

        assertNotNull(cursor);

        cursor.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

附注:如果在应用程序中使用,提供程序可以正常工作

提前致谢.

cha*_*ter 20

我自己也遇到过这个问题.您需要告诉AndroidJUnit4使用@Before注释运行setUp方法.如果不这样做,则在单元测试运行之前不会调用setUp方法.

用于覆盖http://developer.android.com/training/testing/integration-testing/content-provider-testing.html上的setUp方法的代码片段具有误导性,并未提及您需要@Before注释.

请尝试以下方法:

@Before
@Override
public void setUp() throws Exception
{
    setContext(InstrumentationRegistry.getTargetContext());
    super.setUp();
}
Run Code Online (Sandbox Code Playgroud)


Coo*_*ter 1

作为 setUp() 方法的一部分,应该创建 MockContentResolver。使用它来创建和注入提供程序。

请参阅类 MockContentResolver: http://developer.android.com/reference/android/test/mock/MockContentProvider.html

示例来源: http://alvinalexander.com/java/jwarehouse/android/test-runner/src/android/test/ProviderTestCase2.java.shtml

上面链接中示例的部分示例:

 @Override
    protected void setUp() throws Exception {
        super.setUp();

        mResolver = new MockContentResolver();
        final String filenamePrefix = "test.";
        RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(
                new MockContext2(), // The context that most methods are delegated to
                getContext(), // The context that file methods are delegated to
                filenamePrefix);
        mProviderContext = new IsolatedContext(mResolver, targetContextWrapper);

        mProvider = mProviderClass.newInstance();
        mProvider.attachInfo(mProviderContext, null);
        assertNotNull(mProvider);
        mResolver.addProvider(mProviderAuthority, getProvider());
    }
Run Code Online (Sandbox Code Playgroud)

  • 这正是我的观点,如果 ProviderTestCase2.setUp() 已经创建了一个 MockcontentResolver,为什么我应该在子类中创建自己的呢? (4认同)