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.
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)?
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));
}
}
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. :)
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é.
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
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
import androidx.test.core.app.ApplicationProvider;
private Context context = ApplicationProvider.getApplicationContext();
Les autres réponses sont obsolètes. À l'heure actuelle, chaque fois que vous étendez AndroidTestCase, vous pouvez utiliser un objet Contexte mContext.
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);
}
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"
}
src/test
répertoire.@RunWith(RobolectricTestRunner.class
testeur.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