2017-10-17 16 views
0

私のテストの@Before機能でエスプレッソidlingResourceを登録しようとしていますが、メインスレッドから実行する必要があるというエラーが発生しています。ここに私がこれまで持っていたものがあります:エスプレッソidlingResource - 登録方法?

@Before 
    public void setUp() throws Exception { 
     mIntentsTestRule.getActivity().sharedPrefRepo.clearAll(); 

     new Thread(){ 
      @Override 
      public void run() { 
       super.run(); 
       IdlingResource loadingDialogIdlingResource = new LoadingDialogIdlingResource(); 
       IdlingRegistry.getInstance().register(loadingDialogIdlingResource); 
      } 
     }.start(); 

} 

しかし、この種は意味をなさないです。私はこれらのものを別のスレッドに登録していますが、完了する前にテストを続行しますか?これらのことを本当に登録する方法は何ですか?私はこのようになりますだけでなくティアダウンでの登録解除機能を作成しました:

@After 
    public void tearDown() throws Exception { 
     //handle any clean up 
     mIntentsTestRule.getActivity().sharedPrefRepo.clearAll(); 
     freeIdlingResources(); 
    mIntentsTestRule.getActivity().finish(); 
    } 

私はスレッドを使用しない場合、エラーは以下の通りです:(旧Espresso.registerIdlingResources:

java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.RuntimeException: This method can not be called from the main application thread 
at android.support.test.espresso.base.IdlingResourceRegistry.runSynchronouslyOnMainThread(IdlingResourceRegistry.java:314) 
at android.support.test.espresso.base.IdlingResourceRegistry.sync(IdlingResourceRegistry.java:90) 
at android.support.test.espresso.Espresso.onView(Espresso.java:69) 

は注意してください、 )メソッドは、getInstance()。register()を介してIdlingRegistryによって非推奨になりました。

更新:ここに私のidlresourceコードは次のとおりです。

public class LoadingDialogIdlingResource implements IdlingResource { 
     private ResourceCallback resourceCallback; 
     private boolean isIdle; 

     @Override 
     public String getName() { 
      return LoadingDialogIdlingResource.class.getName(); 
     } 

     @Override 
     public boolean isIdleNow() { 
      if (isIdle) return true; 

      Activity activity = getCurrentActivity(); 
      if (activity == null) return false; 

      Fragment f = activity.getFragmentManager().findFragmentByTag(ProgressDialogFragment.class.getName()); 
      isIdle = f == null; 
      if (isIdle) { 
       resourceCallback.onTransitionToIdle(); 
      } 
      return isIdle; 
     } 

     public Activity getCurrentActivity() { 
      final Activity[] currentActivity = {null}; 

      InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable(){ 
       public void run(){ 
        Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED); 
        Iterator<Activity> it = resumedActivity.iterator(); 
        currentActivity[0] = it.next(); 
       } 
      }); 
      return currentActivity[0]; 
     } 

     @Override 
     public void registerIdleTransitionCallback(
       ResourceCallback resourceCallback) { 
      this.resourceCallback = resourceCallback; 
     } 
    } 
+0

残りのテストコードを表示できますか?このエラーはEspresson.onView()からのものであると思われます。問題はそのメソッドを呼び出す場所にある可能性が高いです。 – jdonmoyer

+0

メインスレッドで実行されないアイドル状態のリソースが表示されている質問を更新しました。 – j2emanue

答えて

0

問題は、コードのこのブロックにあった:runOnMainSyncを呼び出す

public Activity getCurrentActivity() { 
    final Activity[] currentActivity = {null}; 

    InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable(){ 
     public void run(){ 
      Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED); 
      Iterator<Activity> it = resumedActivity.iterator(); 
      currentActivity[0] = it.next(); 
     } 
    }); 
    return currentActivity[0]; 
} 

はここで禁じられています。私はフラグメントマネージャをコンストラクタに渡すだけで問題を解決しました。

+0

あなたの回答を受け入れたものとしてマークしてください –

関連する問題