ProviderTestCase2.getProvider()为null

时间:2015-06-16 14:38:11

标签: 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();
    }
}

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

提前致谢。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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());
    }