在多个测试活动以E preSSO空指针 [英] Testing across multiple activities with Espresso Null Pointer

查看:164
本文介绍了在多个测试活动以E preSSO空指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我运行一个测试,带我到另一个活动。当我去,我需要等待对话框消失。

 公共类StressTest扩展ActivityInstrumentationTestCase2< D​​ashboardActivity> {DashboardActivity活动;
ConsoleActivity consoleActivity;
公共StressTest(){
    超(DashboardActivity.class);
}公共无效设置()抛出异常{
    super.setUp();
    活性= getActivity();
}公共无效testRun()抛出InterruptedException的{
    时间表();
    快速开始();
    IP.enterIP();
< -----------方式无法HERE从NPE ------------------->
    而(consoleActivity.getConnectDialog()=空&放大器;!&放大器; consoleActivity.getConnectDialog()isShown()){
        视频下载(
    }
}

正如你所看到的,我开始在 DashboardActivity 。那么一旦到 ConsoleActivity ,我需要检查 ConnectDialog 。我怎样才能做到这一点没有得到一个NPE?

修改

 公共无效testRun()抛出InterruptedException的{
    时间表();
    快速开始();
    IP.enterIP();
    视频下载(500);    getInstrumentation()。runOnMainSync(新的Runnable(){
        @覆盖
        公共无效的run(){
            收集和LT;活动> resumedActivities = ActivityLifecycleMonitorRegistry.getInstance()getActivitiesInStage(Stage.RESUMED)。
            Log.d(RESUMED活性大小,+ resumedActivities.size());            如果(resumedActivities.size()== 1){
                consoleActivity =(ConsoleActivity)resumedActivities.iterator()next()方法。
            }其他{            }
        }
    });
    而(consoleActivity.getConnectDialog()=空&放大器;!&放大器; consoleActivity.getConnectDialog()isShown()){
        视频下载(1000);
    }

日志

  Log.d(ACTIVITES,的getClass:。+ resumedActivities.iterator()next()方法的getClass()的getName()+ConsoleActivity:+ ConsoleActivity。 class.getName());

印刷:

  D / ACTIVITES:的getClass:com.android.lonewolf.activity.console.ConsoleActivity ConsoleActivity:com.android.lonewolf.activity.console.ConsoleActivity


解决方案

您收到一个NullPointerException异常,因为你的 consoleActivity 未初始化。
下面放code之前而()

EDITED

 的Iterator<活性GT;迭代器;
活动活动;
收集和LT;活动> resumedActivities;
getInstrumentation()。runOnMainSync(新的Runnable(){
    公共无效的run(){
            resumedActivities = ActivityLifecycleMonitorRegistry.getInstance()
                .getActivitiesInStage(Stage.RESUMED);
            迭代= resumedActivities.iterator();
            }
        }
    });
而(iterator.hasNext()){
    活性= iterator.next();
    如果(activity.getClass()的getName()。等于(ConsoleActivity.class.getName())){
        consoleActivity =(ConsoleActivity)活性;
    }
}

和进口ActivityLifecycleMonitorRegistry:

 进口com.google.android.apps.common.testing.testrunner.ActivityLifecycleMonitorRegistry;

I am running a test that takes me in to another activity. When I get to that I need to wait for a dialog to disappear.

  public class StressTest extends ActivityInstrumentationTestCase2<DashboardActivity> {

DashboardActivity activity;
ConsoleActivity consoleActivity;


public StressTest() {
    super(DashboardActivity.class);
}

public void setUp() throws Exception {
    super.setUp();
    activity = getActivity();
}

public void testRun() throws InterruptedException {
    schedule();
    quickstart();
    IP.enterIP();
<-----------FAILS HERE FROM A NPE------------------->
    while (consoleActivity.getConnectDialog() != null && consoleActivity.getConnectDialog().isShown()){
        Thread.sleep(
    } 
}

As you can see, I am starting in DashboardActivity. Then Once in to ConsoleActivity, I need to check for ConnectDialog. How can I do this without getting a NPE?

EDIT

 public void testRun() throws InterruptedException {
    schedule();
    quickstart();
    IP.enterIP();
    Thread.sleep(500);

    getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
            Collection<Activity> resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
            Log.d("RESUMED ACTIVITY SIZE", "" + resumedActivities.size());

            if(resumedActivities.size() == 1){
                consoleActivity = (ConsoleActivity) resumedActivities.iterator().next();
            } else {

            }
        }
    });
    while (consoleActivity.getConnectDialog() != null && consoleActivity.getConnectDialog().isShown()){
        Thread.sleep(1000);
    }

LOGS

Log.d("ACTIVITES", "getClass: " + resumedActivities.iterator().next().getClass().getName() + " ConsoleActivity: " + ConsoleActivity.class.getName());

printed :

 D/ACTIVITES﹕ getClass: com.android.lonewolf.activity.console.ConsoleActivity ConsoleActivity: com.android.lonewolf.activity.console.ConsoleActivity

解决方案

You receive a NullPointerException because your consoleActivity isn't initialized. Put code below before while().

EDITED

Iterator<Activity> iterator;
Activity activity;
Collection<Activity> resumedActivities;
getInstrumentation().runOnMainSync(new Runnable() {
    public void run() {
            resumedActivities = ActivityLifecycleMonitorRegistry.getInstance()
                .getActivitiesInStage(Stage.RESUMED);
            iterator = resumedActivities.iterator();
            }
        }
    });
while(iterator.hasNext()){
    activity = iterator.next();
    if(activity.getClass().getName().equals(ConsoleActivity.class.getName())){
        consoleActivity = (ConsoleActivity)activity;
    }
}

And import ActivityLifecycleMonitorRegistry:

import com.google.android.apps.common.testing.testrunner.ActivityLifecycleMonitorRegistry;

这篇关于在多个测试活动以E preSSO空指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆