116 votes

Obtenir le contexte du projet de test dans le cas de test junit Android

Est-ce que quelqu'un sait comment on peut obtenir le contexte de la Projet de test dans le scénario de test Android junit (extends AndroidTestCase).

Note : Le test n'est PAS un test d'instrumentation.

Note 2 : J'ai besoin du contexte du projet de test, pas du contexte de l'application réelle qui est testée.

J'en ai besoin pour charger certains fichiers à partir des actifs du projet de test.

0 votes

Pourquoi ne pouvez-vous pas simplement utiliser InstrumentationTestCase ?

1 votes

Parce que je teste les services, pas l'interface utilisateur.

1 votes

Il y a une meilleure réponse ici : [Utiliser AndroidTestCase au lieu d'un test JUnit][1] [1] : stackoverflow.com/questions/3170706/

157voto

fada21 Points 186

Il y a une nouvelle approche avec la bibliothèque de support des tests Android (actuellement androidx.test:runner:1.1.1 ). Exemple de mise à jour de Kotlin :

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

    @Before
    fun setup() {
        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
    }

    @Test
    fun someTest() {
        TODO()
    }
}

Si vous voulez aussi que le contexte de l'application fonctionne :

InstrumentationRegistry.getInstrumentation().targetContext

Exemple de fonctionnement complet : https://github.com/fada21/AndroidTestContextExample

Regardez ici : Quelle est la différence entre getTargetContext() et getContext (sur InstrumentationRegistry) ?

1 votes

Enfin une réponse sur la façon d'utiliser JUnit4 avec InstrumentationTest. Après des heures de recherche. Je dois aimer le développement Android.

1 votes

Nice ! tx (notez qu'il y a une faute de frappe dans votre membre de classe)

1 votes

Quelqu'un pourrait-il m'indiquer quelles dépendances doivent être ajoutées dans le fichier gradle pour que cela fonctionne ?

37voto

Zainodis Points 917

Après quelques recherches, la seule solution qui fonctionne semble être celle que yorkw a déjà indiquée. Vous devez étendre InstrumentationTestCase et ensuite vous pouvez accéder au contexte de votre application de test en utilisant getInstrumentation().getContext() - voici un bref extrait de code utilisant les suggestions ci-dessus :

public class PrintoutPullParserTest extends InstrumentationTestCase {

    public void testParsing() throws Exception {
        PrintoutPullParser parser = new PrintoutPullParser();
        parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
    }
}

7 votes

Oui, mais il semble idiot qu'Android ne donne pas accès au contexte du projet de test dans les tests JUnit simples. Le contexte est là dans AndroidTestCase.mTestContext mais il est privé. Je ne vois pas pourquoi.

0 votes

@peceps Full Ack - mais c'est comme ça et je n'aime pas ça non plus ;)

24voto

Timothée Jeannin Points 2462

Comme vous pouvez le lire dans le Code source AndroidTestCase le getTestContext() est cachée.

/**
 * @hide
 */
public Context getTestContext() {
    return mTestContext;
}

Vous pouvez contourner le @hide annotation en utilisant la réflexion.

Il suffit d'ajouter la méthode suivante dans votre AndroidTestCase :

/**
 * @return The {@link Context} of the test project.
 */
private Context getTestContext()
{
    try
    {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    }
    catch (final Exception exception)
    {
        exception.printStackTrace();
        return null;
    }
}

Ensuite, appelez getTestContext() quand vous voulez. :)

2 votes

Cela a parfaitement fonctionné pour moi et je charge les actifs en utilisant le Contexte soit de AndroidTestCase via cette méthode, soit de ActivityInstrumentationTestCase2.getInstrumentation ().getContext () then getResources ().getAssets ()

1 votes

Pouvez-vous spéculer sur la raison pour laquelle ils l'ont caché ? Si nous utilisons cette technique, pourraient-ils supprimer la méthode dans une version ultérieure (en cassant notre code de test) ?

1 votes

Je reçois java.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()

5voto

Si vous voulez obtenir le contexte avec Kotlin et Mockito, vous pouvez le faire de la manière suivante :

val context = mock(Context::class.java)

0 votes

Obtenir la nullité dans le contexte ?

0 votes

Et n'oubliez pas d'annoter votre classe de test avec @RunWith(MockitoJUnitRunner::class)

4voto

eslamb Points 113

Mise à jour : AndroidTestCase Cette classe a été dépréciée au niveau 24 de l'API. Utilisez InstrumentationRegistry à la place. Les nouveaux tests doivent être écrits en utilisant la bibliothèque de support des tests Android. Lien vers l'annonce

Vous devriez étendre à partir de AndroidTestCase au lieu de TestCase.

Présentation de la classe AndroidTestCase
Prolongez cela si vous avez besoin d'accéder aux ressources ou à d'autres choses qui dépendent du contexte d'activité.

AndroidTestCase - Développeurs Android

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X