Eigentlich muss ich eine Antwort auf einen API-Aufruf bekommen, dafür brauchte ich Context
.
Eigentlich muss ich eine Antwort auf einen API-Aufruf bekommen, dafür brauchte ich Context
.
Antworten:
Aktualisieren.
Verwenden Sie einfach für Version 1.x und 2.x:
Robolectric.application;
Und für Version 3.x:
RuntimeEnvironment.application;
Und für Version 4.x:
zu deiner build.gradle
Datei hinzufügen :
testImplementation 'androidx.test:core:1.0.0'
Rufen Sie den Kontext ab mit:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
statischen Code verwenden (wie mit Anmerkungen versehene Methoden @BeforeClass
), da Robolectric zu diesem Zeitpunkt wahrscheinlich nicht initialisiert wird und der Wert lautet null
.
Hinzufügen
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
Und benutze:
private val app = ApplicationProvider.getApplicationContext()
Für den neuesten Robolectric 4.3 ab 2019 `
ShadowApplication.getInstance ()
`und
Roboletric.application
sind beide beraubt. Also benutze ich
Context context = RuntimeEnvironment.systemContext;
Kontext zu bekommen.
Um den Anwendungskontext zu erhalten, müssen Sie Folgendes tun:
Dies funktioniert bei mir mit Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
oder RuntimeEnvironment.application.getApplicationContext()
wenn es für dich funktioniert.
Ab Release 4.0-alpha-3 am 21. Juli wurden sie entfernt ShadowApplication.getApplicationContext()
. Halten Sie sich RuntimeEnvironment.application.getApplicationContext()
für alle mit Anmerkungen versehenen Tests an @RunWith(RobolectricTestRunner::class)
.
Abgesehen davon enthält der aktuelle Leitfaden ein Beispiel für das Abrufen von Zeichenfolgenressourcen mithilfe von:
final Context context = RuntimeEnvironment.application;
(Beachten Sie, dass die Javadocs für RuntimeEnvironment
und ShadowApplication
derzeit die Nicht-Alpha-Version 3.x widerspiegeln.)
In einigen Fällen benötigen Sie möglicherweise den Kontext Ihrer App anstelle des Robolectris-Standardkontexts. Zum Beispiel, wenn Sie Ihren Paketnamen erhalten möchten. Standardmäßig gibt Robolectric Ihren org.robolectric.default
Paketnamen zurück. Gehen Sie wie folgt vor, um Ihren tatsächlichen Paketnamen zu erhalten:
build.gradle
testImplementation 'org.robolectric:robolectric:4.2.1'
Ihre Testklasse:
@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());
}
}
Stellen Sie sicher, dass in Ihrem Arbeitsverzeichnis Run / Debug Configurations Folgendes festgelegt ist: $ MODULE_DIR $
Es ist sicherer , zu verwenden , Robolectric.getShadowApplication()
anstatt mit Robolectric.application
direkt.
Robolectric.application
Stimmen Sie den Antworten von @EugenMartynov und @rds zu ....
Ein kurzes Beispiel finden Sie bei Volley-Marshmallow-Release
in NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
Der Volley-Link ist unter https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release verfügbar
Sie müssen Abhängigkeiten im Volley-Modul in Android Studio hinzufügen als:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
In Ihrem Fall sollten Sie sich bewusst sein, was Sie tatsächlich testen. Manchmal ist es ein Zeichen dafür, dass Ihr Code möglicherweise überarbeitet werden muss, wenn Probleme mit nicht testbarem Code oder scheinbar nicht testbarem Code auftreten.
Für eine API-Aufrufantwort möchten Sie möglicherweise den API-Aufruf selbst nicht testen. Es ist möglicherweise nicht erforderlich zu testen, ob es möglich ist, Informationen von einem beliebigen Webdienst zu senden / zu empfangen, sondern dass Ihr Code Ihre Antwort in einem erwarteten Zustand verarbeitet und verarbeitet.
In diesem Fall ist es möglicherweise besser, den Code, den Sie testen möchten, umzugestalten. Brechen Sie das Parsen / Behandeln von Antworten in eine andere Klasse auf, die eine einfache akzeptiert, String
und führen Sie Ihre Tests für diese Klasse durch, indem Sie Antworten auf Beispielzeichenfolgen einfügen.
Dies folgt mehr oder weniger den Vorstellungen von Single Responsibility und Dependency Inversion ( S und D in SOLID ).
Ok, ich weiß also, dass viele andere diese Antwort schon einmal gesagt haben und möglicherweise bereits veraltet sind
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);
Ich habe null bekommen, weil der when () Teil NACH der Sut-Initialisierung war. Es könnte einigen von Ihnen helfen.
auch ich habe die
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
zu Beginn des Unterrichts
Ebenfalls
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works