我有一个类,用于查询MediaStore的图像。例如,我有看起来像someContentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ... )
的代码。除了其他方面,我想测试一下我对MediaStore的查询是否正确。
到目前为止,我在测试中所做的是:
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 );
我将此解析器注入(inject)到我的类中,该解析器对其执行查询。但是,查询返回null。我看到了这篇文章:http://ikaruga2.wordpress.com/2013/07/29/roboelectric-and-contentresolverscontentproviders/,它说要使用ShadowContentResolver注册内容提供者,所以类似:
ShadowContentResolver.registerProvider( MediaStore.AUTHORITY, <SOMETHING_GOES_HERE> );
但我不知道该为内容提供商提供什么。也许使用
MediaStore
对象?不,它不是ContentProvider
。也许是MediaProvider
?由于某种原因,该符号无法解析。在这一点上,我严重怀疑这甚至是正确的方法。有人可以指引我正确的方向吗?
使用Robolectric 2.4快照和API 19。
最佳答案
您可以依靠 ShadowContentResolver.setCursor(Uri, BaseCursor)
和 RoboCursor
创建测试数据并验证查询。 RoboCursor
没有提供某些方法的完整实现,因此您可以覆盖和忽略它们,或者做一些有意义的事情。 RoboCursor
扩展了BaseCursor
,覆盖 setQuery()
允许您拦截查询并在其中验证或执行某些操作。使用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);
关于android - 是否可以使用robolectric用测试版替换MediaStore?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24591119/