Ist es möglich, den MediaStore mit einem Test-Doppel zu ersetzen?

9

Ich habe eine Klasse, die den MediaStore nach Bildern abfragt. Zum Beispiel habe ich Code, der aussieht wie someContentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ... ) . Ich möchte unter anderem testen, ob meine Anfragen an den MediaStore korrekt sind.

Was ich bisher in meinem Test getan habe, ist dies:

%Vor%

Ich injiziere diesen Resolver in meine Klasse, die eine Abfrage durchführt. Die Abfrage gibt jedoch null zurück. Ich habe diesen Beitrag gesehen: Ссылка , das besagt, dass der Inhaltsanbieter mithilfe von ShadowContentResolver registriert wird , etwas wie:

%Vor%

aber ich weiß nicht, was ich für den Inhaltsanbieter angeben soll. Vielleicht ein MediaStore -Objekt verwenden? Nein, es ist kein ContentProvider . Vielleicht ist es MediaProvider ? Das Symbol kann aus irgendeinem Grund nicht aufgelöst werden.

An dieser Stelle habe ich ernsthafte Zweifel, dass dies sogar im Entferntesten der richtige Ansatz ist. Kann mich jemand in die richtige Richtung lenken?

mit Robolectric 2.4 Snapshot und API 19.

    
Kevin 05.07.2014, 22:34
quelle

2 Antworten

1

Sie können sich auf ShadowContentResolver.setCursor(Uri, BaseCursor) und RoboCursor um Testdaten zu erstellen und Abfragen zu verifizieren. RoboCursor bietet keine vollständige Implementierung einiger Methoden, sodass Sie sie entweder überschreiben und ignorieren oder etwas Sinnvolles tun können. RoboCursor erweitert BaseCursor und überschreibt setQuery() ermöglicht es Ihnen, Abfragen abzufangen und dort etwas zu überprüfen oder zu tun. Verwenden von Robolectric 3.0.

%Vor%     
hidro 28.06.2016 03:02
quelle
0

Ich hatte ein ähnliches Problem mit MediaStore, in meinem Fall versuchte eine Klasse, über eine managedQuery auf den MediaStore zuzugreifen. Beim Ausführen eines Tests, der diesen Codepfad durchlaufen hat, ist der Test mit einer NPE fehlgeschlagen, da die Abfrage wie in Ihrem Fall null zurückgegeben hat.

Die beleidigende Methode

%Vor%

Vorausgesetzt, dass Sie bereits injizieren (ich injective Abhängigkeiten mit Dolch auf meinem Projekt) der Resolver, möchten Sie es entweder verspotten, wenn es Ihnen passt (über Mockito zum Beispiel), oder verspotten Sie es teilweise, so die problematische Methode Standardwert ist ein verwendbarer Rückgabewert.

%Vor%

Wenn der Test versucht, getPath() auszuführen, wird die Abfrage nicht ausgeführt, sondern der im partiellen Mock festgelegte Standard-Rückgabewert verwendet, sodass der Test fortgesetzt werden kann.

Ich weiß, dass es vielleicht nicht genau das ist, wonach Sie suchen, aber es könnte für Sie genauso gut sein wie für mich.

    
J.C. Chaparro 17.12.2014 19:09
quelle