9

Görüntüler için MediaStore'u sorgulayan bir dersim var. Örneğin, someContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ...) gibi görünen bir kod var. Diğer şeylerin yanı sıra, MediaStore'a yaptığım sorguların doğru olduğunu test etmek istiyorum. Benim testinde ana kadar ne yaptıkMediaStore'u robolectric kullanarak bir test çiftiyle değiştirmek mümkün mü?

şudur:

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

Bunun üzerine bir sorgu gerçekleştirir Dersimde, içine bu çözümleyicinizi enjekte edin. Ancak, sorgu null değerini döndürür. Ben bu yazı gördüm: ShadowContentResolver kullanarak içerik sağlayıcı kayıt diyor http://ikaruga2.wordpress.com/2013/07/29/roboelectric-and-contentresolverscontentproviders/, bu nedenle, bir şey gibi:

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

ama içerik sağlayıcı koymak için bilmiyorum. Belki bir MediaStore nesnesini kullanın? Hayır, ContentProvider değil. Belki de MediaProvider mu? Sembol bir sebepten ötürü çözülemez. Bu noktada, bunun doğru bir şekilde doğru bir yaklaşım olduğu konusunda ciddi şüphelerim var. Birisi beni doğru yönde yönlendirebilir mi?

Robolectric 2.4 anlık ve API I Mediastore ile benzer bir sorunu vardı 19.

+0

Henüz bir çözüm buldunuz mu? –

+0

@SebastianRoth hayır, yok. – Kevin

cevap

0

kullanılarak, benim durumunda bir sınıfı, bir managedQuery yoluyla Mediastore ulaşmak için çalışılmıştır. Bu gibi bir kod yolundan geçen bir testi çalıştırdığınızda, test, NFP ile başarısız oldu çünkü sorgu, tıpkı sizin durumunuzda olduğu gibi döndü.

Zaten (Projemde Dagger ile bağımlılıkları enjekte) örneğin Mockito yoluyla (size uygun olup olmadığından çözümleyici, sen onu alay ya isteyebilirsiniz enjekte düşünüldüğünde kusurlu yöntemi

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

) ya da kısmen alay etmemek için, kusurlu yöntem kullanılabilir bir dönüş değerini varsayılan olarak kullanır.

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

Bu şekilde, deney getPath() çalıştırmak çalışırken, bu sorguyu aday olmayacağını, fakat test gitmek için izin kısmi mock ayarlanan varsayılan dönüş değeri kullanın.

Tam olarak aradığınızı olmayabilir, ancak sizin için yaptığınız gibi ihtiyaçlarınıza uygun olabilir.

+0

Sorguyu gerçekten doğrulamak istiyorum. Yine de cevabınız için teşekkürler! – Kevin

1

Test verilerini oluşturmak ve sorgulamayı doğrulamak için ShadowContentResolver.setCursor(Uri, BaseCursor) ve RoboCursor güvenebilirsiniz. RoboCursor, birkaç yöntemin tam olarak uygulanmasını sağlamaz, bu nedenle bunları geçersiz kılabilir veya yok sayabilir veya anlamlı bir şey yapabilirsiniz., setQuery()'u geçersiz kılar; setQuery()'u geçersiz kılar, sorguları engellemenize ve buradaki bir şeyi doğrulamanıza veya yapmanıza olanak tanır. Robolectric 3.0 Kullanımı.

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); 
İlgili konular