android - 使用 Espresso Null Pointer 跨多个 Activity 进行测试

标签 android nullpointerexception android-testing

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

  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

最佳答案

您收到 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;

关于android - 使用 Espresso Null Pointer 跨多个 Activity 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20912169/

相关文章:

java - libGDX - 奇怪的碰撞行为

android - 是否可以将本地化字符串放入单独的 strings.xml 文件中?

java - Android - TextView 上的 NullPointerException

android - AppCompatActivity 中的 fragment

java - 在 Android 上使用蓝牙的服务发现失败异常

Android线程无法访问Main.xml

android - 如何通过 uiautomator 设置密码字段的文本

android-gradle-plugin - 如何使用 ./gradlew 在特定模拟器上运行特定任务?

android - ConnectedAndroidTest 执行的任务列表是什么?

android - 无法完成 session : INSTALL_FAILED_INVALID_APK: Split lib_slice_0_apk was defined multiple times