9

Ho una classe che esegue una query sul MediaStore per le immagini. Ad esempio, ho un codice che assomiglia a someContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ...). Voglio verificare che, tra le altre cose, le mie domande sul MediaStore siano corrette.è possibile sostituire il MediaStore con un doppio di prova usando robolectric?

Quello che ho fatto finora nella mia prova è questo:

ContentResolver resolver = new Activity().getContentResolver(); 
ContentValues values = new ContentValues(); 
values.put(MediaStore.Images.Media.DATA, 
      "/fake/path/file1.jpg"); 
values.put(MediaStore.Images.Media.DATE_ADDED, 
      fakeTime.getTime()); 
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       values); 

inietto questo resolver nella mia classe, che esegue una query su di esso. Tuttavia, la query restituisce null. Ho visto questo post: http://ikaruga2.wordpress.com/2013/07/29/roboelectric-and-contentresolverscontentproviders/ che dice per registrare il provider di contenuti utilizzando ShadowContentResolver, quindi, qualcosa di simile a:

ShadowContentResolver.registerProvider(MediaStore.AUTHORITY, <SOMETHING_GOES_HERE>); 

ma non so cosa mettere per il fornitore di contenuti. Forse usi un oggetto MediaStore? No, non è un ContentProvider. Forse è MediaProvider? Il simbolo non può essere risolto, per qualche motivo.

A questo punto ho seri dubbi che questo sia anche lontanamente l'approccio corretto. Qualcuno può guidarmi nella giusta direzione?

utilizzando Robolectric 2.4 istantanea e API 19.

+0

Hai già trovato una soluzione? –

+0

@SebastianRoth no, non l'ho fatto. – Kevin

risposta

0

ho avuto un problema simile con MediaStore, nel mio caso una classe cercato di accedere al MediaStore attraverso un managedQuery. Durante l'esecuzione di un test che ha attraversato tale percorso di codice, il test ha avuto esito negativo con un NPE, in quanto la query ha restituito null proprio come nel tuo caso.

Il metodo incriminato

public String getPath(Uri uri, Activity activity) { 
    String[] projection = { MediaColumns.DATA }; 
    Cursor cursor = activity 
      .managedQuery(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

Dato che si sta già iniettando (I iniettare le dipendenze con il pugnale sul mio progetto) il risolutore, si potrebbe desiderare di uno deridere esso, se vi si addice (via Mockito ad esempio), o parzialmente deriderlo, quindi il metodo incriminato imposta un valore di ritorno utilizzabile.

PhotoUtilities pu=Mockito.spy(new PhotoUtilities()); 
Mockito.doReturn(Constants.getDataDir().getAbsolutePath()+"/aaa.txt"). 
when(pu).getPath(Mockito.isA(Uri.class), Mockito.isA(Activity.class)); 

In questo modo, quando il test ha tentato di eseguire getPath(), non sarebbe eseguire la query, ma utilizzare il valore di ritorno di default impostato nel finto parziale, permettendo al test per andare avanti.

So che potrebbe non essere quello che stai cercando esattamente, ma potrebbe soddisfare i tuoi bisogni come ha fatto per me.

+0

In realtà desidero convalidare la query. Comunque grazie per la risposta! – Kevin

1

È possibile fare affidamento su ShadowContentResolver.setCursor(Uri, BaseCursor) e RoboCursor per creare dati di test e verificare la query. RoboCursor non fornisce l'implementazione completa di alcuni metodi, quindi è possibile ignorarli e ignorarli oppure eseguire un'azione significativa. RoboCursor estende BaseCursor, ignorando setQuery() consente di intercettare le query e verificare o fare qualcosa lì. Utilizzo di Robolectric 3.0.

RoboCursor cursor = new RoboCursor() { 
    @Override 
    public void registerContentObserver(ContentObserver observer) { 
     // no op 
    } 

    @Override 
    public void unregisterContentObserver(ContentObserver observer) { 
     // no op 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     // no op 
    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 
     // no op 
    } 

    @Override 
    public boolean isClosed() { 
     return true; 
    } 
}; 
cursor.setColumnNames(Arrays.asList(MediaStore.Images.Media._ID, 
     MediaStore.Images.Media.BUCKET_DISPLAY_NAME)); 
cursor.setResults(new Object[][]{ 
     new Object[]{1L, "WhatsApp"}, 
     new Object[]{2L, "Photos"}, 
     new Object[]{3L, "WhatsApp"} 
}); 
shadowOf(ShadowApplication.getInstance().getContentResolver()) 
     .setCursor(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor); 
Problemi correlati