2016-03-08 5 views
15

Ich möchte bestätigen, dass meine Aktivität, die ich gerade teste, beendet ist, wenn bestimmte Aktionen ausgeführt werden. Leider kann ich es bis jetzt nur behaupten, indem ich am Ende des Tests etwas Schlaf hinzufüge. Gibt es einen besseren Weg?Espresso Wie testen, ob die Aktivität beendet ist?

import android.content.Context; 
import android.os.Build; 
import android.support.test.rule.ActivityTestRule; 
import android.test.suitebuilder.annotation.LargeTest; 

import org.junit.Before; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.JUnit4; 

import static org.junit.Assert.assertTrue; 

@SuppressWarnings("unchecked") 
@RunWith(JUnit4.class) 
@LargeTest 
public class MyActivityTest { 

    Context context; 

    @Rule 
    public ActivityTestRule<MyActivity> activityRule 
      = new ActivityTestRule(MyActivity.class, true, false); 

    @Before 
    public void setup() { 
     super.setup(); 
     // ... 
    } 

    @Test 
    public void finishAfterSomethingIsPerformed() throws Exception { 

     activityRule.launchActivity(MyActivity.createIntent(context)); 

     doSomeTesting(); 

     activityRule.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       fireEventThatResultsInTheActivityToFinishItself(); 
      } 
     }); 

     Thread.sleep(2000); // this is needed :(

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      assertTrue(activityRule.getActivity().isDestroyed()); 
     } 

    } 

} 

Antwort

0

können Sie startActivityForResult verwenden Beispiel unten, weitere Beschreibungen in Links.

Wie Aktivität von FirstActivity starten:

Intent i = new Intent(this, SecondActivity.class); 
startActivityForResult(i, 1); 

Das ist, wie Sie Ihre SecondActivity zu beenden, zuerst zurück zu gehen (ohne Ergebnis senden):

Intent returnIntent = new Intent(); 
setResult(Activity.RESULT_CANCELED, returnIntent); 
finish(); 

Wie Ereignis auszulösen, wenn SecondActivity beendet (ist in FirstActivity geschrieben):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 1) { 

    } 
}//onActivityResult 

Mehr können Sie hier finden: http://developer.android.com/training/basics/intents/result.html und dort How to manage `startActivityForResult` on Android? gibt es auch, wie Sie die Daten senden können, die Sie von SecondActivity erhalten möchten.

+0

Vielen Dank für Ihre Antwort. Ich denke, ich war nicht klar genug. Mein Problem ist, dass ich keine zweite Aktivität oder eine erste Aktivität habe. Ich habe nur eine Aktivität. Also kann ich deine Lösung nur verwenden wenn ich eine Dummy erste Aktivität starte, nur um meine Activtiy starten zu können, die ich von da aus testen möchte. – IHeartAndroid

+0

damit hast du deine runnable und willst etwas machen nachdem es fertig ist? –

+0

Ich möchte sicherstellen, dass meine Aktivität nach dem fireEventThatResultsInTheActivityToFinishItself() geschlossen ist; heißt – IHeartAndroid

28

In meinem Fall kann ich testen, für isFinishing():

assertTrue(activityTestRule.getActivity().isFinishing());

statt:

Thread.sleep(2000); // this is needed :(

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     assertTrue(activityRule.getActivity().isDestroyed()); 
    } 

Ein weiterer Vorteil von isFinishing() ist, dass Sie die Versionsprüfung nicht brauchen.

+0

Sicher, mit 'isFinishing()' ist schön, aber Sie sprechen nicht den Hauptpunkt der Frage an, wie man den Schlaf umgehen soll. –

+0

Nach meinem Verständnis verlangte der OP nach einem besseren Weg, um zu behaupten, so dass er das 'Thread.sleep' vermeiden kann. – keineantwort

+1

Ich habe festgestellt, dass Sie die 'Thread.sleep()' nach dem Testen Ihres Codes vermeiden können. Sie haben jedoch vergessen, dies zu erwähnen, also habe ich Ihre Antwort bearbeitet, um den Punkt deutlicher zu machen. –

0

Nicht sicher, ob es eine gute Praxis, aber das ist für mich:

assertTrue(mTestRule.getActivity() == null); 
Verwandte Themen