2016-03-08 32 views
15

Şu anda test ettiğim Etkinlikimin belirli eylemler gerçekleştirildiğinde bittiğini iddia etmek istiyorum. Ne yazık ki şimdiye kadar sadece testin sonunda biraz uyku ekleyerek bunu iddia ediyorum. Daha iyi bir yolu var mı?Espresso Aktivite bittiğinde nasıl test edilir?

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()); 
     } 

    } 

} 

cevap

0

Aşağıdaki StartActivityForResult örneğini, bağlantılardaki daha fazla açıklamaları kullanabilirsiniz.

FirstActivity Ait Etkinlik başlatmak için:

(sonuç göndermeden) geri ilk gitmek için SecondActivity bitirmek için nasıl
Intent i = new Intent(this, SecondActivity.class); 
startActivityForResult(i, 1); 

: SecondActivity bittiğinde Olay kaldırın Nasıl

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

(FirstActivity'de yazılmıştır):

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

    if (requestCode == 1) { 

    } 
}//onActivityResult 

Daha fazla bilgi burada bulabilirsiniz: http://developer.android.com/training/basics/intents/result.html ve orada How to manage `startActivityForResult` on Android? da SecondActivity'den almak istediğiniz verileri nasıl gönderebilirsiniz.

+0

Teşekkür Yanıtınız için. Sanırım yeterince açık değildim. Benim sorunum, ikinci bir etkinliğim veya ilk etkinliğim olmaması. Benim sadece bir etkinliğim var. Bu yüzden ben senin çözümünü kullanabilirim sadece ben sadece bir test başlatmak istiyorum benim Activtiy başlatmak için bir kukla ilk Etkinlik başlarsa .. – IHeartAndroid

+0

böylece senin runnable var ve bittikten sonra bir şeyler yapmak ister? –

+0

Etkinliğimin, fireEventThatResultsInTheActivityToFinishItself() öğesinden sonra kapatıldığından emin olmak istiyorum; – IHeartAndroid

28

Benim durumumda ben isFinishing() için test edebilirsiniz:

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

yerine:

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

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

isFinishing() bir diğer avantajı Sürüm kontrolü gerekmez vardır.

+0

denir Elbette, 'isFinishing()' kullanarak güzel, ama uyku etrafında nasıl çalışılacağı sorusunun ana noktasını ele almıyorsunuz. –

+0

Benim anlayışımda OP, iddia etmek için daha iyi bir yol soruyordu, bu yüzden 'Thread.sleep'den kaçınabiliyordu. – keineantwort

+1

Kodunuzu test ettikten sonra Thread.sleep() işlevinden sakınabileceğinizi fark ettim. Ancak, bahsetmeyi unuttuğunuz için, cevabınızı daha açık hale getirmek için cevabınızı düzenledim. –

0

eğer onun iyi bir uygulama emin ama bu benim için çalıştı değil:

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