Android Instrumentation启动活动

时间:2013-03-17 12:55:30

标签: android instrumentation

我有一个包含按钮的简单活动。当我按下按钮时,第二个活动就会运行。现在我是Android Instrumentation Testing的新手。到目前为止,这是我写的

public class TestSplashActivity extends
    ActivityInstrumentationTestCase2<ActivitySplashScreen> {

private Button mLeftButton;
private ActivitySplashScreen activitySplashScreen;
private ActivityMonitor childMonitor = null;
public TestSplashActivity() {
    super(ActivitySplashScreen.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();
    final ActivitySplashScreen a = getActivity();
    assertNotNull(a);
    activitySplashScreen=a;
    mLeftButton=(Button) a.findViewById(R.id.btn1);

}

@SmallTest
public void testNameOfButton(){
    assertEquals("Press Me", mLeftButton.getText().toString());
    this.childMonitor = new ActivityMonitor(SecondActivity.class.getName(), null, true);
    this.getInstrumentation().addMonitor(childMonitor);
    activitySplashScreen.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            mLeftButton.performClick();
    }});

    Activity childActivity=this.getInstrumentation().waitForMonitorWithTimeout(childMonitor, 5000);
    assertEquals(childActivity, SecondActivity.class);

}

}

现在第一个断言,我得到按钮的文本工作。但是,当我调用执行单击时,我得到一个异常

  Only the original thread that created a view hierarchy can touch its views. 

现在我在Android应用程序的上下文中理解了这个异常,但现在在仪器测试方面。如何在按钮上执行click事件,以及如何检查是否已加载第二个活动。

1 个答案:

答案 0 :(得分:2)

假设您有一个扩展InstrumentationTestCase的测试类,并且您使用的是测试方法,它应遵循以下逻辑:

  1. 注册您对要检查的活动的兴趣。
  2. 启动它
  3. 用它做你想做的事。检查组件是否正确,执行用户操作以及那种事情。
  4. 在“序列”
  5. 中注册您对下一个活动的兴趣
  6. 执行该活动的操作,使序列的下一个活动弹出。
  7. 按照这个逻辑重复......
  8. 就代码而言,这将产生如下内容:

    Instrumentation mInstrumentation = getInstrumentation();
    // We register our interest in the activity
    Instrumentation.ActivityMonitor monitor = mInstrumentation.addMonitor(YourClass.class.getName(), null, false);
    // We launch it
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setClassName(mInstrumentation.getTargetContext(), YourClass.class.getName());
    mInstrumentation.startActivitySync(intent);
    
    Activity currentActivity = getInstrumentation().waitForMonitor(monitor);
    assertNotNull(currentActivity);
    // We register our interest in the next activity from the sequence in this use case
    mInstrumentation.removeMonitor(monitor);
    monitor = mInstrumentation.addMonitor(YourNextClass.class.getName(), null, false);
    

    要发送点击,请执行以下操作:

    View v = currentActivity.findViewById(....R.id...);
    assertNotNull(v);
    TouchUtils.clickView(this, v);
    mInstrumentation.sendStringSync("Some text to send into that view, if it would be a text view for example. If it would be a button it would already have been clicked by now.");