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
.
Ü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.
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.
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
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.