2015-06-16 22 views
5

Próbuję przetestować klasę ContentProvider i nie mogę jej uruchomić.ProviderTestCase2.getProvider() ma wartość null

Funkcja getProvider() zwraca wartość null, ale jak rozumiem z kodu ProviderTestCase2.setUp(), nie powinien.

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

marginesie: operator działa, jeżeli są stosowane w obrębie aplikacji.

Z góry dziękuję.

+0

Czy coś dodać do swojego dostawcy oprócz zwykłych metod zapytania, włóż ... provider? – Luksprog

+0

nop, nic dziwnego – Cheborra

+0

Czy wypróbowałeś kilka różnych poziomów APi, urządzeń itp? –

Odpowiedz

1

Jako część metody setUp() należy utworzyć MockContentResolver. Użyj tego, aby utworzyć i wstrzyknąć dostawcę.

See klasa MockContentResolver: http://developer.android.com/reference/android/test/mock/MockContentProvider.html

Źródło przykład: http://alvinalexander.com/java/jwarehouse/android/test-runner/src/android/test/ProviderTestCase2.java.shtml

Częściowa próbka z przykładu w linku powyżej:

@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

Dokładnie o to mi chodzi, jeśli ProviderTestCase2.setUp() tworzy już MockcontentResolver, dlaczego powinienem tworzyć własne w klasie potomnej? – Cheborra

17

po prostu wpadł na ten problem samodzielnie. Musisz poinformować AndroidJUnit4, aby uruchomił metodę setUp z adnotacją @Before. Jeśli tego nie zrobisz, metoda setUp nie zostanie wywołana przed uruchomieniem testu urządzenia.

Fragment kodu służący do przesłonięcia metody setUp na http://developer.android.com/training/testing/integration-testing/content-provider-testing.html jest mylący i nie wspomina o konieczności adnotacji @Before.

Spróbuj wykonać następujące czynności:

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

To było bardzo pomocne, dzięki! – Magillus

+0

To wygląda na pomyłkę - dlaczego nigdy nie nazywają 'setUp'? –