2017-10-16 14 views
1

La (pertinente) partie de la structure du dossier de mon projet comme suitAndroid Studio: Inclure les classes de test bibliothèque dans le test de l'application

├───lib 
│ └───src 
│  ├───androidTest 
│  │ └───com.example.lib 
│  │  └───utils 
│  │  └───... 
│  └───main 
│   └───com.example.lib 
│    └───... 
└───mobile 
    └───src 
     ├───androidTest 
     │ └───com.example.app 
     │  └───... 
     └───main 
      └───com.example.app 
       └───... 

J'ai donc le module « lib », fournissant des fonctionnalités réutilisables et le module « mobile ", contenant l'application réelle. Les deux modules ont leur propre androidTest (test d'instrumentation) où les activités sont testées. Le code de test lib contient également des classes d'utilité, par ex. lib/src/androidTest/com.example.app/utils/TestUtils.java:

package com.example.lib; 

/** 
* Utility functions for tests 
*/ 
public class TestUtils { 

    public static Matcher<View> nthChildOf(final Matcher<View> parentMatcher, final int childPosition) { 
     return new TypeSafeMatcher<View>() { 
      @Override 
      public void describeTo(Description description) { 
       description.appendText("with " + childPosition + " child view of type parentMatcher"); 
      } 

      @Override 
      public boolean matchesSafely(View view) { 
       if (!(view.getParent() instanceof ViewGroup)) { 
        return parentMatcher.matches(view.getParent()); 
       } 

       ViewGroup group = (ViewGroup) view.getParent(); 
       View child = group.getChildAt(childPosition); 
       return parentMatcher.matches(view.getParent()) && child != null && child.equals(view); 
      } 
     }; 
    } 
    ... 

En utilisant cette classe TestUtils des travaux du module de test lib mais quand je les appelle à partir du module de test mobile, le compilateur se plaint:

Error:(28, 19) error: cannot find symbol class TestUtils

par exemple dans le fichier mobile/src/androidTest/com.example.app/SettingActivityTest.java:

package com.example.app; 
import de.ioxp.lib.TestUtils; // This line results in the error, but IntelliJ opens the correct file when clicking on it. 

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class SettingActivityTest { 
    ... 

Ma question est la suivante: Comment puis-je utiliser des classes de la suite de tests de ma bibliothèque dans ma principale suite de tests d'application?

je l'ai déjà ajouté un androidTestCompile explicite pour la bibliothèque de mon portable/build.gradle, mais cela n'a pas eu aucun résultat:

dependencies { 
    compile project(':lib') 
    androidTestCompile project(':lib') // this line makes no difference, maybe I have to address the lib's testing directly. But how? 

    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    } 
    androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2'; 
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 
} 

Répondre

1

C'est parce que androidTest partie de votre bibliothèque ne compilera pas dans la cible mobile . Il y a deux façons de résoudre ce problème.

Vous pouvez déplacer la classe test util vers les sources de votre bibliothèque (principale), ou vous pouvez déplacer test util vers la bibliothèque externe et l'ajouter via testAndroidCompile dans votre bibliothèque et votre mobile.

+0

Merci pour la suggestion, j'ai essayé, mais j'ai rencontré le problème suivant: les classes d'utilité de test ont besoin de classes du module lib. Donc j'obtiens une dépendance circulaire '' lib <-> testLib'' qui n'est pas possible. Exemple: J'ai une IdlingResource spéciale pour une classe View personnalisée. Les deux sont nécessaires dans les tests de la bibliothèque et le test de l'application réelle – PhilLab

+0

C'est pourquoi vous devriez faire test lib qui sera ajouté par androidTest Compile dans les deux projets. D'ailleurs - bon à savoir qu'il ya des développeurs qui écrivent des tests;) –

+0

Mon testlib a un '' MyViewIdlingResource'' qui teste '' MyView'' du projet de bibliothèque. Donc le test lib ajoute la librairie dans le fichiergradle: '' compile project (': lib') ''. Maintenant, je ne peux pas écrire dans le fichier gradle de ma bibliothèque '' androidTestCompile project (': testLib') '' car cela induirait une dépendance circulaire. Et j'utilise aussi le '' MyViewIdlingResource'' dans les tests du projet principal, donc je ne peux pas le déplacer vers le fichier de test de la librairie. – PhilLab