web-dev-qa-db-fra.com

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

Est-ce que quelqu'un sait comment obtenir le contexte du test Projet test dans Android, cas de test Junit (étend AndroidTestCase).

Remarque: le test n'est PAS un test d'instrumentation.

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

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

96
peceps

Une nouvelle approche avec Android Test Support Library (actuellement androidx.test:runner:1.1.1). Kotlin exemple mis à jour:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

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

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

Si vous voulez aussi exécuter le contexte de l'application:

InstrumentationRegistry.getInstrumentation().targetContext

Exemple d'exécution complète: https://github.com/fada21/AndroidTestContextExample

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

113
fada21

Après quelques recherches, la seule solution qui semble fonctionner semble être celle déjà soulignée par yorkw. Vous devez étendre InstrumentationTestCase pour pouvoir accéder au contexte de votre application de test à l'aide de 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));
    }
}
37
AgentKnopf

Comme vous pouvez le lire dans le code source AndroidTestCase , la méthode getTestContext() est masquée.

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

Vous pouvez contourner l'annotation @hide À l'aide de la réflexion.

Ajoutez simplement 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() à tout moment. :)

25
Timothée Jeannin

Mise à jour: AndroidTestCase Cette classe était obsolète dans l'API de niveau 24. Utilisez plutôt InstrumentationRegistry. Les nouveaux tests doivent être écrits avec la Android Bibliothèque de support des tests. Lien vers l'annonce

Vous devez étendre AndroidTestCase au lieu de TestCase.

Présentation de la classe AndroidTestCase
Étendez-le si vous devez accéder à des ressources ou à d’autres éléments dépendant du contexte d’activité.

AndroidTestCase - Android Développeurs

4
eslamb

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)

J'espère que cela vous aidera

2
Juan E. Londoño T.

C'est pour corriger le moyen d'obtenir le contexte. D'autres méthodes sont déjà obsolètes

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context
1
tomrozb
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();
0
eoinzy

Les autres réponses sont obsolètes. À l'heure actuelle, chaque fois que vous étendez AndroidTestCase, vous pouvez utiliser un objet Contexte mContext.

0
Yoni Keren

Si vous avez juste besoin d'accéder aux ressources de votre projet, vous pouvez utiliser la méthode getActivity () de ActivityInstrumentationTestCase2 :

 //...
 private YourActivityClass mActivity;
 @Override
 protected void setUp() throws Exception {
 //...
     mActivity = getActivity();

 }
 //...
 public void testAccessToResources() {
     String[] valueList;
     valueList = 
         mActivity.getResources().getStringArray(
                 com.yourporject.R.array.test_choices);
 }
0
0x8BADF00D

Vous pouvez utiliser Robolectric pour Android tests unitaires sur la machine virtuelle Java).

Robolectric est un framework qui vous permet d'écrire des tests unitaires et de les exécuter sur une JVM de bureau tout en utilisant Android API.

Robolectric fournit une version compatible avec JVM du fichier Android.jar. Robolectric prend en charge l’inflation de vues, le chargement de ressources et bien d’autres éléments implémentés dans le code C natif sur les appareils Android.

dependencies {
    ...
    // Robolectric
    testCompile "org.robolectric:robolectric:3.3.2"
}
  1. Vos tests doivent être stockés dans le src/test répertoire.
  2. La classe contenant votre test Robolectric doit être annotée avec le @RunWith(RobolectricTestRunner.class testeur.
  3. Il doit également utiliser @Config () pour pointer sur votre classe BuildConfig.class.

Par exemple

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

public class WelcomeActivityTest
{
    private WelcomeActivity activity;

    @Before
    public void setUp() throws Exception
    {
        activity = Robolectric.buildActivity( WelcomeActivity.class )
                              .create()
                              .resume()
                              .get();
    }

    @Test
    public void shouldNotBeNull() throws Exception
    {
        assertNotNull( activity );
    }
}

Lire la suite ici

0
yoAlex5