在多个测试活动以E preSSO空指针 [英] Testing across multiple activities with Espresso Null Pointer
问题描述
我运行一个测试,带我到另一个活动。当我去,我需要等待对话框消失。
公共类StressTest扩展ActivityInstrumentationTestCase2< DashboardActivity> {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屋!