web-dev-qa-db-fra.com

Uri.parse () renvoie toujours la valeur null dans le test unitaire

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.

15
3k-

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.

12
Marcin Jedynak

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.

14
Allen

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

3
Rafal Zawadzki

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.

0
3k-