In realtà, ho bisogno di ottenere una risposta a una chiamata API, per questo ho richiesto Context
.
In realtà, ho bisogno di ottenere una risposta a una chiamata API, per questo ho richiesto Context
.
Risposte:
Aggiornare.
Basta usare per la versione 1.xe 2.x:
Robolectric.application;
E per la versione 3.x:
RuntimeEnvironment.application;
E per la versione 4.x:
aggiungi al tuo build.gradle
file:
testImplementation 'androidx.test:core:1.0.0'
recuperare il contesto con:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
codice statico (come i metodi annotati con @BeforeClass
) poiché Robolectric probabilmente non verrà inizializzato a quel punto e il valore sarà null
.
Inserisci
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
E usa:
private val app = ApplicationProvider.getApplicationContext()
Per l'ultimo Robolectric 4.3 a partire da adesso nel 2019 `
ShadowApplication.getInstance ()
`e
Roboletric.application
sono entrambi deprecati. Quindi sto usando
Context context = RuntimeEnvironment.systemContext;
per ottenere Context.
Per ottenere il contesto dell'applicazione è necessario eseguire le seguenti operazioni:
Questo funziona per me con Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
o RuntimeEnvironment.application.getApplicationContext()
se funziona per te.
A partire dalla versione 4.0-alpha-3 del 21 luglio, hanno rimosso ShadowApplication.getApplicationContext()
. Attenersi a RuntimeEnvironment.application.getApplicationContext()
per qualsiasi test annotato con @RunWith(RobolectricTestRunner::class)
.
Per inciso, la loro guida attuale ha un esempio di come ottenere risorse di stringa utilizzando:
final Context context = RuntimeEnvironment.application;
(Tieni presente che i javadoc per RuntimeEnvironment
e ShadowApplication
attualmente riflettono la versione non alpha 3.x.)
In alcuni casi, potresti aver bisogno del contesto della tua app invece del contesto predefinito di Robolectris. Ad esempio, se vuoi ottenere il nome del tuo pacchetto. Per impostazione predefinita, Robolectric ti restituiràorg.robolectric.default
nome del pacchetto. Per ottenere il nome reale del tuo pacchetto, procedi come segue:
build.gradle
testImplementation 'org.robolectric:robolectric:4.2.1'
La tua lezione di prova:
@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {
@Test
public void fooTestWithPackageName(){
Context context = ApplicationProvider.getApplicationContext();
System.out.println("My Real Package Name: " + context.getPackageName());
}
}
Assicurati che nella tua directory di lavoro Run / Debug Configurations sia impostata su: $ MODULE_DIR $
È più sicuro da usare Robolectric.getShadowApplication()
invece di usare Robolectric.application
direttamente.
Robolectric.application
D'accordo con le risposte di @EugenMartynov e @rds ....
Un rapido esempio può essere trovato su Volley-Marshmallow-Release
in NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
Il link Volley è disponibile https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
devi aggiungere le dipendenze nel modulo volley in Android Studio come:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
Nel tuo caso, penso che dovresti essere consapevole di ciò che stai effettivamente testando. A volte incorrere in problemi di non verificabile codice o il codice apparentemente non verificabile è un segno che forse il vostro codice deve essere riscritta.
Per una risposta alla chiamata API potresti non voler testare la chiamata API stessa. Potrebbe non essere necessario verificare che sia possibile inviare / ricevere informazioni da qualsiasi servizio Web arbitrario, ma piuttosto che il codice gestisce ed elabora la risposta in un maniero previsto.
In tal caso potrebbe essere meglio rifattorizzare il codice che stai tentando di testare. Suddividi la risposta analizzando / gestendo un'altra classe che accetta un semplice String
ed esegui il test su quella classe iniettando risposte di stringa di esempio.
Questo è più o meno seguendo le idee di Single Responsibility and Dependency Inversion (The S and D in SOLID )
Ok, quindi so che molti altri hanno già detto questa risposta e potrebbero già essere obsoleti
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);
Ho ottenuto null, perché la parte when () era DOPO l'inizializzazione di sut. Potrebbe aiutare alcuni di voi.
anche io ho il file
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
all'inizio della lezione
Anche
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works