2016-03-08 81 views
15

我想斷言,我正在測試的Acitivty在執行某些操作時完成。不幸的是,到目前爲止,我只是通過在測試結束時添加一些睡眠來斷言它。有沒有更好的辦法 ?Espresso如何測試活動是否完成?

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

    } 

} 

回答

0

您可以在下面使用StartActivityForResult示例,更多鏈接描述。

如何從FirstActivity開始活動:

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

這是如何完成你的SecondActivity回到第一(不發送結果):

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

如何當SecondActivity完成增加事件(寫在FirstActivity):

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

    if (requestCode == 1) { 

    } 
}//onActivityResult 

更多你可以在這裏找到:http://developer.android.com/training/basics/intents/result.htmlHow to manage `startActivityForResult` on Android?還有如何發送你想從SecondActivity獲得的數據。

+0

感謝您的答覆。我想我還不夠清楚。我的問題是我沒有第二項活動或第一項活動。我只有一個活動。因此,只有當我開始虛擬活動時,我才能使用您的解決方案活動只是爲了能夠啓動我想要從那裏測試的Activtiy .. – IHeartAndroid

+0

因此,您有可運行的並且想要在完成後執行某些操作? –

+0

我想確保我的活動在fireEventThatResultsInTheActivityToFinishItself()後關閉。叫做 – IHeartAndroid

28

在我來說,我可以測試isFinishing():代替

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

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

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

isFinishing()另一個優點是,你不需要版本檢查。

+0

可以肯定的是,使用'isFinishing()'很好,但是你沒有解決如何解決睡眠問題的主要問題。 –

+0

在我的理解中,OP要求提供更好的方式來聲明,所以他可以避免使用'Thread.sleep'。 – keineantwort

+1

我注意到你可以在測試你的代碼後避免使用'Thread.sleep()'。但是,您忘記提及這一點,所以我編輯了您的答案,以使這一觀點更加明確。 –

0

不知道它是一個很好的做法,但這個工作對我來說:

assertTrue(mTestRule.getActivity() == null); 
相關問題