2017-03-15 6 views
1

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:

enter image description here

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.

+0

Verwenden Sie das Plugin 2.3.0? Versuchen Sie es mit 2.2.3. – azizbekian

+0

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

Antwort

0

Switching Android-Plugin-Version zu 2.2.3 und dann zurück zu 2.3.0 zurück, Reinigung Projekt und Gebäude behebt das Problem.

Verwandte Themen