2017-03-17 4 views
6

In Espresso Klasse:Espresso.pressBack() ruft nicht onBackPressed()

@Rule 
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
      MainActivity.class); 

@Test 
public void test_backButton(){ 
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click()); 

Espresso.pressBack(); 
} 

In Aktivität:

@Override 
public void onBackPressed() { 
    Log.d("TEST_pressBack", "inside onBackPressed()"); 
    do_something(); 
    super.onBackPressed(); 

} 
    @Override 
public void finish() { 
    Log.d("TEST_pressBack", "inside finish()"); 
    super.finish(); 

} 

Wenn ich den Espresso-Test-Methode aufrufen, die Ausführung direkt zu finish() geht.

Wenn ich die Zurück-Taste (mit der Hand) drücke in den Activity die Ausführung geht zunächst in onBackPressed() und dann zu finish(). Wie kann ich die Funktion onBackPressed() mit Espresso testen? Danke!

EDIT: Es ist mein Fehler. Das Problem war, dass in der Aktivität, in der ich pressBack aufrufen wollte, die Bildschirmtastatur geöffnet wurde. Wenn die Soft-Tastatur geöffnet ist, ruft die Drucktaste kein BackPressed auf, sondern bewirkt, dass die Tastatur nicht angezeigt wird. Ich habe versucht, mit zwei pressBack() in einer Reihe und es funktionierte richtig:

@Rule 
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
      MainActivity.class); 

@Test 
public void test_backButton(){ 
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click()); 

Espresso.pressBack(); 

//The extra pressBack() 
Espresso.pressBack(); 

} 
+1

Sie verwendet haben könnte Espresso.closeSoftKeyboard() –

Antwort

4

Es sieht aus wie die Espresso.pressBack() Methode, so wie Sie es erwarten nicht funktionieren, wenn Sie nicht in der Wurzelaktivität sind. Wenn Sie einen Blick auf, dann ist es die Umsetzung Kommentar:

/** 
    * Press on the back button. 
    * 
    * @throws PerformException if currently displayed activity is root activity, since pressing back 
    *   button would result in application closing. 
    */ 
    public static void pressBack() { 
     onView(isRoot()).perform(ViewActions.pressBack()); 
    } 

ich es getestet und es funktioniert gut, wenn Sie diese in einer Tätigkeit zu tun, die nicht Ihre Wurzelaktivität ist. Wenn Sie es dort tun wollen, würde ich vorschlagen, verwenden Sie ui-automator statt (ui-automator perfekt geeignet ist innerhalb Espresso-Tests):

diese in Ihre gradle:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 

Und dann dies tun im Test:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 
mDevice.pressBack(); 
+1

Es ist mein Fehler. Das Problem war, dass in der Aktivität, auf der ich pressBack aufrufen wollte, die Bildschirmtastatur geöffnet wurde. Wenn die Soft-Tastatur geöffnet ist, ruft die Drucktaste kein BackPressed auf, sondern bewirkt, dass die Tastatur nicht angezeigt wird. Ich habe es mit zwei pressBack() versucht und es hat richtig funktioniert – billst

0

@billst Sie haben Recht, auch ich das gleiche Problem mit Soft-Tastatur geöffnet hatte, gedebuggt ich nach dem Kommentar und eine bessere Lösung zu lesen wäre ViewAction.closeSoftKeyboard() zu verwenden, anstatt zurück zu verwenden zweimal drücken.

@Test 
public void afterStartedEditing_dialogDisplayed_when_home_or_back_pressed() { 
    //find view 
    onView(withId(R.id.add_pet_breed)) 
      .perform(click()) 
      .perform(closeSoftKeyboard()); 
    onView(isRoot()).perform(pressBack()); 

    //check assertion 
    onView(withText(R.string.discard)) 
      .check(matches(isDisplayed())); 
}