2017-10-17 147 views
0

在我的一个测试的@Before函数中,我正在尝试注册espresso idlingResource,但是我一直收到错误消息,说明它需要从主线程运行。这是我到目前为止:Espresso 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(); 
    } 

误差低于如果我不使用线程:

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) 

请注意:前Espresso.registerIdlingResources( )方法已被IdlingRegistry通过getInstance()。register()弃用。

更新:这里是我的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

的问题是在这个代码块:

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]; 
} 

调用runOnMainSync这里禁止的。我通过简单地将片段管理器传入构造函数来解决问题。

+0

请将您的答案标记为已接受 –