2016-11-17 2 views
6

Dieser einfache Komponententest besteht immer und ich kann nicht herausfinden, warum.Uri.parse() liefert immer Null in Unit-Test

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

Was ich bisher versucht, eine "traditionelle" URI verwendet (http://example.com) aber uri war auch null.

Antwort

4

Überprüfen Sie, ob Sie Folgendes in Ihrer App gradle Datei:

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

Uri ist ein Android-Klasse und als solche nicht in der lokalen Unit-Tests verwendet werden, ohne den Code über Sie folgendes erhalten:

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

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

+0

Ich habe in meinem OP angegeben, dass der Test bestanden wird, also gibt es keine Ausnahme. Außerdem benötige ich nicht nur ein Nicht-Null-Uri-Objekt, ich brauche ein Uri-Objekt mit bestimmten Eigenschaften (Schema, Pfad, etc.) –

+0

Ich habe dies hinzugefügt, aber immer noch nicht funktionieren – Allen

0

Schließlich meinen Code Ich habe gerade URIs wie String zu akzeptieren, es funktioniert so jetzt sowohl in der Produktion und Test und die Verwendung von Uri.parse() weglassen. Jetzt, wo ein URI benötigt wird, verwende ich einfach uri.toString(), anstatt einen String zu analysieren.

+1

Ich denke nicht, dass das eine gute Idee ist. Durch die Verwendung von Uri bieten Sie im Vergleich zu Strings eine höhere Stufe des Typs. Strings können alles enthalten, mit einem Uri wissen Sie zumindest, dass es ein gültiger Uri ist. Ihre Komponententests sollen Ihre Codequalität erhöhen, nicht verringern. Ich würde diesen Test lieber in einen verbundenen (Espresso) Test verwandeln. – Michael

2

Ich löse dieses Problem mit Robolectric.

das sind meine Unit-Test-Config

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 für mich funktioniert, hoffen, dass diese Ihnen helfen können.

+0

Warum die -1 auf diesem? Meiner Meinung nach ist dies die richtige Antwort, denn Robolectric bietet Ihnen eine tatsächliche Implementierung von Uri, nicht nur eine Kopie, zusammen mit Implementierungen von allem, was Sie sonst noch benötigen, um Android zu testen. – Bradford2000