En fait, je dois obtenir une réponse d'un appel d'API, pour cela j'avais besoin de Context
.
Mise à jour.
Il suffit d'utiliser pour les versions 1.x et 2.x:
Robolectric.application;
Et pour la version 3.x:
RuntimeEnvironment.application;
Vous pouvez utiliser
RuntimeEnvironment.application
Utilisez ceci:
Robolectric.application
Ajouter
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
Et utilise:
private val app = ApplicationProvider.getApplicationContext()
Pour obtenir le contexte de l'application, vous devez effectuer les opérations suivantes:
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.
À 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.)
Cela fonctionne pour moi avec Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
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' }
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
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 )
Il est préférable d'utiliser Robolectric.getShadowApplication()
au lieu d'utiliser Robolectric.application
directement.
Ajoutez d’abord ce qui suit à votre build.gradle
:
testImplementation 'androidx.test:core:1.2.0'
puis utilisez:
ApplicationProvider.getApplicationContext() as Application