web-dev-qa-db-fra.com

Comment accéder au contexte d'une application dans Robolectric?

En fait, je dois obtenir une réponse d'un appel d'API, pour cela j'avais besoin de Context.

101
user1667968

Mise à jour.

Il suffit d'utiliser pour les versions 1.x et 2.x:

Robolectric.application;

Et pour la version 3.x:

RuntimeEnvironment.application;
199
Eugen Martynov

Vous pouvez utiliser

RuntimeEnvironment.application
25
rds

Utilisez ceci:

Robolectric.application
18
Xian

Ajouter

testImplementation "androidx.test:core-ktx:${deps.testrunner}"

Et utilise:

private val app = ApplicationProvider.getApplicationContext()
14
John

Pour obtenir le contexte de l'application, vous devez effectuer les opérations suivantes:

  1. annoter @RunWith (RobolectricTestRunner.class)
  2. RuntimeEnvironment.application.getApplicationContext ()
5
user1390616

Pour la dernière version de Robolectric 4.3 dès 2019 `

ShadowApplication.getInstance ()

`et

Roboletric.application

sont tous deux privés. Donc j'utilise

Context context = RuntimeEnvironment.systemContext;

pour obtenir le contexte.

3
The_Martian

À compter de release 4.0-alpha- le 21 juillet, ils retirésShadowApplication.getApplicationContext(). Coller avec RuntimeEnvironment.application.getApplicationContext() pour tous les tests annotés avec @RunWith(RobolectricTestRunner::class).

En passant, leur guide actuel présente un exemple d'obtention de ressources de chaîne en utilisant:

final Context context = RuntimeEnvironment.application;

(Notez que les javadocs pour RuntimeEnvironment et ShadowApplication reflètent actuellement la version non alpha 3.x.)

2
qix

Cela fonctionne pour moi avec Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext

2
Farrukh Najmi

D'accord avec les réponses de @EugenMartynov et @rds ....

Un exemple rapide peut être trouvé à Volley-Marshmallow-Release

dans NetworkImageViewTest.Java

// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

Le lien Volley est disponible https://Android.googlesource.com/platform/frameworks/volley/+/Marshmallow-release

vous devez ajouter des dépendances dans le module volley dans Android studio en tant que:

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }

1
Bhuro

Ok, je sais que beaucoup d’autres ont déjà répondu à cette question et sont peut-être déjà dépassés

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

Je suis devenu nul, car la partie when () était APRÈS l'initialisation sut. Cela pourrait aider certains d'entre vous.

aussi j'ai le

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

au début de la classe

Également

 when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
1
Karoly

Dans votre cas, je pense que vous devriez être conscient de ce que vous testez réellement. Parfois, vous rencontrez des problèmes de code untestable ou du code apparemment indestablable est un signe que votre code doit peut-être être refactorisé.

Pour une réponse à un appel d'API, vous pouvez ne pas vouloir tester l'appel d'API lui-même. Il n’est peut-être pas nécessaire de vérifier qu’il est possible d’envoyer/recevoir des informations à partir de tout service Web arbitraire, mais plutôt que votre code traite et traite votre réponse de manière attendue.

Dans ce cas, il serait peut-être préférable de refactoriser le code que vous essayez de tester. Décomposez l'analyse/la gestion des réponses dans une autre classe qui accepte un String simple et faites votre test sur cette classe en injectant des exemples de réponses de chaîne.

Cela correspond plus ou moins aux idées de Single Responsibility et Inversion de dépendance (Le [~ # ~] s [ ~ # ~] et [~ # ~] d [~ # ~] dans SOLIDE )

1
grego

Il est préférable d'utiliser Robolectric.getShadowApplication() au lieu d'utiliser Robolectric.application directement.

1
drspaceboo

Ajoutez d’abord ce qui suit à votre build.gradle:

testImplementation 'androidx.test:core:1.2.0'

puis utilisez:

ApplicationProvider.getApplicationContext() as Application

1
dougie