我有一个类,用于查询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/

10-11 00:11