Ce test unitaire simple réussit toujours et je ne comprends pas pourquoi.
@RunWith(JUnit4.class)
class SampleTest {
@Test testSomething() {
Uri uri = Uri.parse("myapp://home/payments");
assertTrue(uri == null);
}
}
Ce que j’ai essayé jusqu’à présent, c’est d’utiliser un URI "traditionnel" (http://example.com
) mais uri
était aussi null
.
Vérifiez si le fichier de gradation de votre application contient les éléments suivants:
Android {
...
testOptions {
unitTests.returnDefaultValues = true
}
Uri
est une classe Android et, en tant que telle, ne peut pas être utilisée dans les tests d'unités locales. Sans le code ci-dessus, vous obtenez les éléments suivants:
Java.lang.RuntimeException: Method parse in Android.net.Uri not mocked. See http://g.co/androidstudio/not-mocked for details.
Le code ci-dessus supprime cette exception et fournit à la place des implémentations factices renvoyant des valeurs par défaut (null
dans ce cas).
L'autre option est que vous utilisez une structure dans vos tests qui fournit des implémentations des méthodes dans les classes Android.
Je résous ce problème avec Robolectric .
ce sont mes config de test unitaire
build.gradle
dependencies {
...
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.4.2"
}
classe de test
@RunWith(RobolectricTestRunner.class)
public class TestClass {
@Test
public void testMethod() {
Uri uri = Uri.parse("anyString")
//then do what you want, just like normal coding
}
}
cela fonctionne pour moi, espérons que cela peut vous aider.
Uri est une classe Android, il faut donc s'en moquer avant de l'utiliser dans les tests.
Voir cette réponse par exemple: https://stackoverflow.com/a/34152256/5199320
Enfin, je viens de changer mon code pour accepter les URI en tant que String
, de sorte qu’il fonctionne maintenant en production et en test et qu’il omet l’utilisation de Uri.parse()
. Maintenant, lorsqu'un URI est nécessaire, j'utilise simplement uri.toString()
au lieu d'analyser une String
.