2

我正在写浓缩咖啡测试。下面是测试案例无法在45秒内启动意图。也许主线程在合理的时间内没有闲置?

晶圆厂的OnClick,启动应用QuizActivity。

让我向你解释一点关于我的应用程序。

所以应用程序的要求是 -

  1. 有资产的文件夹JSON文件
  2. 我必须分析它,并把数据存储在数据库
  3. 在主要活动从数据库中加载这些数据转化为recyclerview 。还有的Fab按钮,在点击它的应用程序传递数据的随机列表(这是我在recyclerview已加载)到QuizActivity

这是我如何做编码 -

  1. 在MainActivity的onCreate()使用AsyncTask解析数据并将数据插入数据库一次。
  2. 一旦数据可用,通过AsyncTaskLoader将其加载到recyclerview中
  3. 在Fab上设置Onclick监听器。并将所需数据传递给QuizActivity。

下面是我的测试

@RunWith(AndroidJUnit4.class) 
public class ExampleInstrumentedTest { 
    /* @Rule 
    public IntentsTestRule<MainActivity> intentsTestRule = 
      new IntentsTestRule<MainActivity>(MainActivity.class); 
*/ 

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

    @Test 
    public void fabTest(){ 
     onView(withId(R.id.fab)).perform(click()); 
     //Check if the text_question textview is displayed 
     onView(withId(R.id.text_question)).check(matches(isDisplayed())); 
    } 

    /* @Test 
    public void clickFloatingActionButton() { 
     onView(withId(R.id.fab)) 
       .perform(click()); 
     intended(hasComponent(new ComponentName(getTargetContext(), QuizActivity.class))); 
    }*/ 
} 

我的办法是 -

  1. 查找的Fab
  2. 执行单击
  3. 检查显示text_question TextView的。注意这个textview是在QuizActivity上。

后,我跑我得到了测试

了java.lang.RuntimeException:无法启动意图意图{ 行为= android.intent.action.MAIN FLG = 0x14000000 CMP = my_package_name/.MainActivity}在45秒内。主线程可能在合理的时间内没有闲置? 有可能是一个动画或不断重新绘制 屏幕。或者该活动正在创建网络电话?请参阅 线程转储日志。为了便于参考,最后一次事件队列为 ,在您的活动启动请求为1505287862579并且现在为 上次队列空闲时为空闲:1505287862579.如果这些数字是 ,则您的活动可能占用事件队列。

PS - 我已经关闭了所有的动画。代码中没有进度条。

而且更一个音符,如果我注释掉的AsyncTask,AsyncTaskLoader中的onCreate RecyclerView部分()方法,那么测试在流逝。

我怀疑它可能是由于后台任务造成的。

任何人都面临类似的问题?如果您知道解决方案,请告诉我。我挣扎了两天。我在stackoverflow上搜索类似的线程,但没有为我工作。

回答

3

我终于得到了解决方案!

其实,罪魁祸首是我的适配器中的自定义视图。

咖啡等到AsyncTaskAsyncTaskLoader加载数据,但它看起来像自定义视图作为例外规定导致此问题:

主线程的一段合理的时间内一直没有去闲? 有可能是一个动画或不断重新绘制 屏幕。

不管怎么说为了克服这个问题,我需要做的是 -

“如果在测试运行设置自定义视图的知名度水涨船高”

,你会怎么做?

private AtomicBoolean isTestRunning; 

    public synchronized boolean isTestRunning() { 
     if (null == isTestRunning) { 
      boolean istest; 

      try { 

       Class.forName ("Full path of your TestName"); // for e.g. com.example.MyTest 

       istest = true; 
      } catch (ClassNotFoundException e) { 
       istest = false; 
      } 

      isTestRunning = new AtomicBoolean (istest); 
     } 

     return isRunningTest.get(); 
    } 

现在,这里我使用Recyclerview所以在ViewHolder

public InsectHolder(View itemView) 
     { 
      super(itemView); 
         customView = (DangerLevelView) itemView.findViewById(R.id.danger_level_tv); 

      if(isRunningTest()) { 
       customView.setVisibility(View.GONE); 
      } 
     } 

而且耶!你的测试会通过。

希望有人认为它有帮助!

如果您在下面的评论部分有任何问题,请让我知道!

相关问题