Ich versuche, Abhängigkeiten wie lustig zu machen, was in https://artemzin.com/blog/how-to-mock-dependencies-in-unit-integration-and-functional-tests-dagger-robolectric-instrumentation/Mocking Abhängigkeitsfehler mit AndroidJunitRunner und Dagger2
vorgeschlagen Leider kann ich nicht über die folgende Fehlermeldung erhalten, wenn ich meinen AndroidJunit4 Test ausführen:
Test läuft fehlgeschlagen: Kann nicht Instrumentierung Info zu finden: ComponentInfo {com.fisincorporated.aviationweather.test/android.support.test.runner.AndroidJUnitRunner}
ich verschiedene SO Lösungen ausprobiert, die nicht Android Studio Version ohne Glück abhingen
Meine App-Ebene gradle Code-Schnipsel ist:
android {
...
defaultConfig {
...
testInstrumentationRunner "com.fisincorporated.aviationweather.app.OverrideApplicationTestRunner"
}
...
}
Mein OverrideApplicationTestRunner ist:
public class OverrideApplicationTestRunner extends AndroidJUnitRunner {
@Override
@NonNull
public Application newApplication(@NonNull ClassLoader cl,
@NonNull String className,
@NonNull Context context)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException {
return Instrumentation.newApplication(WeatherApplicationTest.class, context);
}
}
WeatherApplicationTest
public class WeatherApplicationTest extends WeatherApplication {
@Override
protected void createDaggerInjections() {
component = DaggerDiComponent.builder()
.appModule(new AppModule(this) {
@Override
public String providesAppSharedPreferencesName() {
return "SHARED_AIRPORT_FUNCTIONAL_TEST";
}
public Retrofit provideAppRetrofit() {
return new AppRetrofit(new MockInterceptor()).getRetrofit();
}
})
.build();
component.inject(this);
}
}
Und AirportWeatherActivityTest
@RunWith(AndroidJUnit4.class)
public class AirportWeatherActivityTest {
@Rule
public ActivityTestRule<AirportWeatherActivity> mActivityRule =
new ActivityTestRule<>(AirportWeatherActivity.class, true, false);
@Test
public void someTest() {
Context targetContext = InstrumentationRegistry.getTargetContext();
Intent intent = new Intent(targetContext, AirportWeatherActivity.class);
mActivityRule.launchActivity(intent);
assertThat(mActivityRule.getActivity().airportWeatherViewModel.airportWeatherList.size(),is(0));
}
}
androidTest Verzeichnisstruktur ist unten:
Ich habe festgestellt, dass, wenn ich den folgenden Test ausführen, es funktioniert, das heißt ich sehe, dass WeatherApplicationTest ausgeführt wird. So scheint es, dass testInstrumentationRunner meinen OverrideApplicationTestRunner findet.
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.fisincorporated.aviationweather", appContext.getPackageName());
}
}
Also ist das Problem durch die Verwendung einer ActivityTestRule?
P.S. Ich habe es versäumt zu sagen, dass ich ein Neuling im Testen bin, also entschuldige ich mich, wenn ich etwas Offensichtliches vermisse.
Verwenden Sie das Plugin 2.3.0? Versuchen Sie es mit 2.2.3. – azizbekian
Ich war auf 2.3.0. Also wechselte ich zu 2.2.3, bekam aber eine Reihe von Datenbindungsfehlern für verschiedene Ausdrücke. Nachdem ich versucht hatte, einige von ihnen zu lösen, sagte ich die Hölle damit. Ich bin zurück zu 2.3.0 gegangen. Aus Lust habe ich dann meinen OverrideApplicationTestRunner ausprobiert und es hat geklappt! Also habe ich die Android-Plug-in-Versionen hin und her geschaltet, um es wirklich zu reparieren, oder ich habe etwas anderes getan, um es zu reparieren (d. H. Einen Fehler von mir, den ich nie rate, aber ich weiß wirklich nicht, was es war.). Azizbenkian - Wenn Sie Ihre Antwort als Antwort eingeben möchten, werde ich Ihnen dafür Kredit geben. – Eric