web-dev-qa-db-fra.com

Robolectric indique "AndroidManifest.xml introuvable"

En essayant de faire fonctionner Robolectric RC3 dans Android Studio, je reçois

Caused by: Java.lang.RuntimeException: build/intermediates/bundles/debug/AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml
at org.robolectric.manifest.AndroidManifest.validate(AndroidManifest.Java:120)
at org.robolectric.manifest.AndroidManifest.getResourcePath(AndroidManifest.Java:469)
at org.robolectric.manifest.AndroidManifest.getIncludedResourcePaths(AndroidManifest.Java:475)
at org.robolectric.RobolectricTestRunner.createAppResourceLoader(RobolectricTestRunner.Java:479)
at org.robolectric.RobolectricTestRunner.getAppResourceLoader(RobolectricTestRunner.Java:471)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.Java:73)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.Java:421)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.Java:234)

J'ai essayé

@Config(manifest = "app/src/main/AndroidManifest.xml", constants = BuildConfig.class, sdk=21)

et j'ai essayé de définir l'emplacement du manifeste dans mon TestRunner, rien n'a fonctionné. Dans le système de fichiers, je vois que le manifeste est

./app/build/intermediates/manifests/full/debug/AndroidManifest.xml

pas à l'endroit que Robolectric recherche. À un moment donné, le manifeste vient d'être ignoré, puis un problème similaire s'est produit pour les ressources, l'application ou Robolectric n'a pas pu trouver une ressource brute utilisée par mon application. C'est dans mon fichier de build:

   sourceSets {
    main {
        Java.srcDirs = ['src/main/Java']
        resources.srcDirs = ['src/main/res']
    }
    test {
        Java.srcDirs = ['src/test/Java', 'src/main/Java']
        resources.srcDirs = ['src/test/res', 'src/main/res']
    }
}

Comment puis-je dire à Robolectric où chercher un manifeste et, plus important encore, où chercher des ressources?

Edit: J'ai vérifié Robolectric à partir de github, je l'ai construit, installé dans mon référentiel local .m2, le fichier gradle fait maintenant référence à la construction SNAPSHOT locale, et je me suis assuré que Gradle n'obtient pas de nouvelle version à partir d'un repo à distance. Puis j'ai copié le RobolectricGradleTestRunner dans mon projet, j'ai changé les lignes où les emplacements des fichiers sont définis: il ne contenait pas le nom du module. Maintenant ça marche.

41
Christine

Je suppose que vous essayez d'exécuter les tests avec JUnit. Vous pouvez essayer deux choses différentes:

  1. Créez une classe TestRunner personnalisée, comme indiqué ici . Vérifiez la section CustomTestRunner, où vous créez essentiellement un TestRunner qui connaît réellement le bon manifeste à utiliser. Spécifiez vos tests à exécuter avec votre lanceur de test, avec le @Config annotation.
  2. (Mon choix préféré) Allez dans la configuration de votre JUnit, Exécuter> Modifier les configurations. Remarquez la zone de texte "Répertoire de travail". Ajouter /app (pour OSX et Linux) ou \app (Windows), vers le chemin écrit dans la zone de texte. Essayez de courir à nouveau et cela devrait fonctionner.
73
J.C. Chaparro

Même problème sur Android Studio. J'ai résolu ce problème pour modifier la configuration de Unit4. Vous pouvez suivre ces choses.

Sur Android Studio.

  1. Modifier les configurations
  2. Dans Junit, vous devez changer le répertoire de travail en $ MODULE_DIR $.

L'important est $ MODULE_DIR $ .

vous pouvez référencer la capture d'écran suivante. Merci.

enter image description here

enter image description here

65
Rooney

J'ai rencontré les mêmes erreurs, nous avons utilisé plusieurs versions et types de build Donc, il y a des étapes pour le faire fonctionner:

  1. Les tests de studio Android exécutent la configuration

Vous devez également définir le répertoire de travail sur $ MODULE_DIR $ sous Windows. http://robolectric.org/getting-started/ devrait dire cela.

  1. Le test unitaire doit être annoté comme ceci:

    @RunWith (RobolectricTestRunner.class) @Config (constants = BuildConfig.class, sdk = 21, manifest = "src/main/AndroidManifest.xml", packageName = "com.example.yourproject") classe publique SomeFragmentTest {

6
Kirill Vashilo

Dans le cas où vous obtenez toujours cette erreur avec Android Studio 3.0, assurez-vous que votre configuration Gradle a ces paramètres:

Android {
    ...
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}
5
busradeniz

Notez qu'intellij 16 EAP a un bogue autour de cette variable $ MODULE_DIR $ (il pointe vers le mauvais endroit), provoquant l'échec des tests avec cette exception. Voir https://youtrack.jetbrains.com/issue/IDEA-149802#tab=History . Devrait être corrigé mi-janvier 2016.

2
sakis kaliakoudas

Vous pouvez renvoyer le même problème ici: https://github.com/robolectric/robolectric/issues/1648

Vous devez le mentionner dans votre code de test:

@Config(manifest = "src/main/AndroidManifest.xml", emulateSdk = 18)

Cela indique au robolectric où se trouve votre fichier manifeste. Cela devrait fonctionner sauf si vous modifiez les valeurs de votre répertoire.

essayez également d'utiliser le modèle disponible sur Internet. Tout y est configuré. Vous n'avez pas besoin de modifier les valeurs de votre répertoire. Vous pouvez l'obtenir à partir d'ici: https://github.com/robolectric/deckard-gradle

Edit: La façon dont je vois est l'exception se produit à "build/intermediates/bundles/debug/AndroidManifest.xml " mais vous dites que le fichier est à "app/build/intermediates/manifests/full/debug/AndroidManifest.xml", Je suppose que ces deux endroits sont différents. Veuillez vous assurer que vous disposez du fichier xml à build/intermediates/bundles/debug/AndroidManifest.xml "

1
Teja Nandamuri

J'ai eu cette erreur après avoir mis à jour AndroidStudio vers 2.3.3 et mon plugin Gradle a également été mis à jour. Il a été résolu en définissant working directory à $MODULE_DIR$ et également la mise à jour de la dépendance robolectric à partir de testCompile 'org.robolectric:robolectric:3.0' à testCompile 'org.robolectric:robolectric:3.4.2'.

Notez que le paramètre working directory tandis que robolectric la version est ancienne ne le résoudra pas.

0
Merka
 Hi All Iam new to RoboElectric was facing lot of struggle to run my first test 
please find the below steps which resolves all the issues.
Step 1: use the version in dependencies     
    testImplementation"org.robolectric:robolectric:4.0" in app.gradle    
step 2: 
in app.gradle inside Android use below
testOptions {    
        unitTests {    
            includeAndroidResources = true      
        }    
    }    

étape 3: dans gradle.properties, collez ce qui suit
enableUnitTestBinaryResources = true

Ça marche !!!

0
prasanna

C'est correct @Christine. Je suis également confronté au problème exact. Et la chose est que le processus de construction ne crée pas du tout de dossier de bundles sous intermédiaires. Et le coureur robolectric personnalisé ne fonctionnait pas non plus. Voici le custom runner que j'ai utilisé. Je n'ai pas encore trouvé la solution, mais il semble que le problème soit lié à la version de l'outil de construction qui doit être utilisée.

[Mise à jour] La modification du répertoire de travail dans ma configuration d'exécution de test unitaire pour pointer vers le répertoire racine du module qui est testé a fonctionné pour moi.

0
kaps