2015-06-16 3 views
5

Я пытаюсь протестировать класс ContentProvider и не могу заставить его работать.ProviderTestCase2.getProvider() is null

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

ли вы добавить что-либо к поставщику помимо обычных методов запроса, вставки ... поставщика? – Luksprog

+0

nop, ничего странного – Cheborra

+0

Вы пробовали несколько разных уровней APi, устройств и т. Д.? –

ответ

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()); 
    } 
+4

Это точно моя точка зрения, если ProviderTestCase2.setUp() уже создает MockcontentResolver, почему я должен создать свой собственный в дочернем классе? – Cheborra

17

Я просто побежал в этот вопрос сам. Вы должны сказать AndroidJUnit4, чтобы запустить метод setUp с аннотацией @Before. Если вы этого не сделаете, метод setUp не будет вызываться до того, как будет запущен ваш модульный тест.

Фрагмент кода для переопределения метода setUp на http://developer.android.com/training/testing/integration-testing/content-provider-testing.html вводит в заблуждение и не упоминает, что вам нужна аннотация @Before.

Попробуйте следующее:

@Before 
@Override 
public void setUp() throws Exception 
{ 
    setContext(InstrumentationRegistry.getTargetContext()); 
    super.setUp(); 
} 
+0

Это было очень полезно, спасибо! – Magillus

+0

Это похоже на ошибку - почему они никогда не называют 'setUp'? –