1

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?

+1

Ü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

+0

erhalten Dank für den Link. Die Datei enthält nur: INSTRUMENTATION_RESULT: shortMsg = Prozess abgestürzt. INSTRUMENTATION_CODE: 0 Nicht nützlich überhaupt. –

Antwort

0

Ich habe andere Module getestet. Herausgefunden, dass das verspottete Refresher-Modul den Testprozess abstürzen würde, weil es ein beobachtbares Feld hat. Die getestete Aktivität versucht, sie zu abonnieren, aber sie ist null.

Die SharedData war viel schwieriger herauszufinden - es behandelt gemeinsame Vorlieben, also im Grunde nur Strings und Booleans. Ich musste alle Verwendungen überprüfen. Der Absturz ist passiert, als ich versucht habe, einen String-Wert als URL (nicht verspottet, also wieder null) an Picasso zu übergeben, um ein Bild zu erhalten.

Moral der Geschichte - eine richtige Crash-Nachricht ist zwei Tage blindes Debuggen wert.

Verwandte Themen