Ich versuche, einen UI-Test auszuführen. Wenn ich keine injizierte Abhängigkeit verspotte, läuft alles gut. Als ich @Provides Rückkehr des Moduls zu spotten Objekt wechseln, erhalte ich die folgende Meldung:Test Instrumentierung Prozess abgestürzt beim injizieren mocked Objekt
Gestartet Lauftests
Prüfgeräten Prozess abgestürzt.
prüfen com.nerfy.features.core.CoreTest # a_shouldDisplayLocationPermissionRequestDialogAtStartup.txt für weitere Einzelheiten.
Tests wurden abgeschlossen.
Ich kann diese TXT-Datei nirgendwo finden, nur einige Test Xmls, die überhaupt nicht informativ sind.
Bearbeiten: Die Datei enthält nur: INSTRUMENTATION_RESULT: shortMsg = Prozess abgestürzt. INSTRUMENTATION_CODE: 0.
App funktioniert gut sonst.
Code Anwendung:
public class Nerfy extends Application {
private AppComponent appComponent;
public static Nerfy get(Context context) {
return (Nerfy) context.getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("on create");
if (appComponent == null) {
appComponent = buildProdAppComponent();
appComponent.inject(this);
}
}
public AppComponent buildProdAppComponent() {
return DaggerAppComponent.builder()
.appModule(new AppModule(this))
.navigationModule(new NavigationModule())
.refreshModule(new RefreshModule())
.repoModule(new RepoModule())
.sharedDataModule(new SharedDataModule())
.threadsModule(new ThreadsModule())
.build();
}
//@VisibleForTesting
public void setAppComponent(AppComponent appComponent) {
System.out.println("on set");
this.appComponent = appComponent;
this.appComponent.inject(this);
}
public AppComponent getAppComponent() {
return appComponent;
}
}
Hier sind einige Testcode:
@RunWith(AndroidJUnit4.class)
@LargeTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class CoreTest {
private UiDevice device;
public SharedData sharedData;
private AppComponent espressoAppComponent;
@Rule
public ActivityTestRule<Core> mActivityRule =
new ActivityTestRule<Core>(Core.class) {
@Override
protected void beforeActivityLaunched() {
System.out.println("beforeActivityLaunched");
sharedData = mock(SharedData.class);
System.out.println("shared data " + sharedData);
espressoAppComponent = DaggerAppComponent.builder()
.appModule(new AppModule((Application) getTargetContext().getApplicationContext()))
.navigationModule(new NavigationModule())
.refreshModule(new RefreshModule())
.repoModule(new RepoModule())
.sharedDataModule(new SharedDataModule(){
@Override
public SharedData providesSharedData(Application application) {
return sharedData;
}
})
.threadsModule(new ThreadsModule())
.build();
((Nerfy) getTargetContext().getApplicationContext()).setAppComponent(espressoAppComponent);
super.beforeActivityLaunched();
}
};
@Before
public void setUp() {
}
@Test
@SdkSuppress(minSdkVersion = 23)
public void a_shouldDisplayLocationPermissionRequestDialogAtStartup() throws Exception {
assertViewWithTextIsVisible(device, TEXT_ALLOW);
assertViewWithTextIsVisible(device, TEXT_DENY);
denyCurrentPermission(device);
}
nichts ausgedruckt wird.
Aber wenn ich wechseln verspott gemeinsam genutzte Daten zu realen
@Override
public SharedData providesSharedData(Application application) {
return super.providesSharedData(application);
Alles läuft gut, Test nicht richtig, weil gemeinsam genutzte Daten nicht verspottet wird. Dann habe ich auch festgestellt, dass die onCreate-Anwendung vor der Aktivitätsregel von beforeActivityLaunch aufgerufen wird, obwohl sie in einigen Tutorials sagt, dass sie vor Anwendungen auf create aufgerufen werden sollte.
Ich habe gefolgt Tutorials wie http://blog.sqisland.com/2015/04/dagger-2-espresso-2-mockito.html
Android Mocking a Dagger2 injected dependency for a Espresso test
How do you override a module/dependency in a unit test with Dagger 2.0?
und ähnliche; auch offizielle dagger2 docs.
Ich habe versucht, Unterklasse-Anwendung, Erstellen neuer Modell und Unterklasse Komponente nur für den Test; activityRule auch nicht bis setUp() beenden, nach dem Injizieren der Komponente hier statt beim overriding von beforeActivityLaunched().
Auch versuchte triviale Fixes wie das Projekt neu aufbauen, android Studio neu starten, Abhängigkeiten aktualisieren.
Mocking einige andere Module bringt auch das gleiche Ergebnis, während Spott andere gut funktioniert.
Irgendwelche Ideen?
Überprüfen Sie https://StackOverflow.com/questions/46435789/how-to-see-the-android-orchestrator-log, wie Sie die TXT-Protokolldatei Verweis in der Fehlermeldung – maciekjanusz
erhalten Dank für den Link. Die Datei enthält nur: INSTRUMENTATION_RESULT: shortMsg = Prozess abgestürzt. INSTRUMENTATION_CODE: 0 Nicht nützlich überhaupt. –