it-swarm.com.de

Uri.parse () gibt im Komponententest immer Null zurück

Dieser einfache Unit-Test ist immer bestanden und ich kann nicht verstehen, warum.

@RunWith(JUnit4.class)
class SampleTest {
    @Test testSomething() {
        Uri uri = Uri.parse("myapp://home/payments");
        assertTrue(uri == null);
    }
}

Was ich bisher ausprobiert habe, ist die Verwendung einer "traditionellen" URI (http://example.com), aber uri war auch null.

15
3k-

Überprüfen Sie, ob Sie in der Abstufungsdatei Ihrer App Folgendes enthalten:

Android {
    ...
    testOptions {
        unitTests.returnDefaultValues = true
    }

Uri ist eine Android-Klasse und kann daher nicht für Tests lokaler Einheiten verwendet werden. Ohne den Code oben erhalten Sie Folgendes:

Java.lang.RuntimeException: Method parse in Android.net.Uri not mocked. See http://g.co/androidstudio/not-mocked for details.

Der obige Code unterdrückt diese Ausnahme und stellt stattdessen Dummy-Implementierungen bereit, die Standardwerte zurückgeben (in diesem Fall null).

Die andere Option ist, dass Sie in Ihren Tests ein Framework verwenden, das Implementierungen der Methoden in Android-Klassen bereitstellt.

12
Marcin Jedynak

Ich löse dieses Problem mit Robolectric .

das ist meine Gerätetestkonfiguration 

build.gradle 

dependencies {
...
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.4.2"
}

testklasse 

@RunWith(RobolectricTestRunner.class)
public class TestClass {

    @Test
    public void testMethod() {
      Uri uri = Uri.parse("anyString")
      //then do what you want, just like normal coding
    }
}

es funktioniert für mich, hoffe das kann dir helfen.

14
Allen

Uri ist eine Android-Klasse und muss daher vor dem Einsatz in Tests verspottet werden.

Siehe diese Antwort zum Beispiel: https://stackoverflow.com/a/34152256/5199320

3
Rafal Zawadzki

Schließlich habe ich gerade meinen Code geändert, um URIs als String zu akzeptieren, so dass er jetzt sowohl in der Produktion als auch im Test funktioniert und die Verwendung von Uri.parse() weglässt. Wo nun ein URI benötigt wird, benutze ich einfach uri.toString(), anstatt eine String zu analysieren.

0
3k-