【问题标题】:Testing across multiple activities with Espresso Null Pointer使用 Espresso Null Pointer 跨多个活动进行测试
【发布时间】:2014-01-03 20:28:56
【问题描述】:

我正在运行一项测试,将我带入另一项活动。当我到达时,我需要等待一个对话框消失。

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

如您所见,我从DashboardActivity 开始。然后一旦进入ConsoleActivity,我需要检查ConnectDialog。我如何在没有 NPE 的情况下做到这一点?

编辑

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

日志

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

【问题讨论】:

  • 你在哪里实例化consoleAcitvity?
  • @cbrulak 我还没有实例化它。我试过consoleActivity = getActivity();,但出现语法错误
  • 好吧,那是你的错误,就在那里。你已经声明了它但还没有实例化它,然后你调用它。这就是 NPE。
  • @Binghammer 你说:“如你所见,我从 DashboardActivity 开始。”我们在哪里看到的?
  • @IgorGanapolsky, sn -p 中的第一行代码:ActivityInstrumentationTestCase2 将在 DashboardActivity 中打开测试

标签: android nullpointerexception android-testing


【解决方案1】:

您收到 NullPointerException 因为您的 consoleActivity 未初始化。 将代码放在while() 之前。

已编辑

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

并导入ActivityLifecycleMonitorRegistry:

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

【讨论】:

  • 我仍然收到 npe。我检查了 resumedActivity 的大小。而且只有一个
  • 检查activity.getClass().getName() 中的Activity 类。您也可以将其与ConsoleActivity.class.getName() 进行比较,以防有多个活动。
  • 活动似乎相同。看看我的 LOGS 更新。
  • 是的,我仍然得到 npe
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多