我尝试测试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();
}
}
附注:如果在应用程序中使用,则提供程序可以正常工作。
提前致谢。
答案 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
以上链接示例中的部分示例:
@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());
}