如何调试Android活动/视图事件

时间:2010-12-07 02:21:37

标签: android unit-testing

我正在尝试为我的Android应用程序编写单元测试。我遇到问题的特定测试只是为了确保当用户点击我的MapView上的某个地方时,应用程序会删除用户点击的标记。但我尝试的一切都给我留下了一些错误信息。有人知道如何写这样的东西吗?

这是我到目前为止所尝试的内容:

public class MyMapActivityTest extends ActivityInstrumentationTestCase2<MyMapActivity> {

public MyMapActivityTest() {
    super("com.example.blah", MyMapActivity.class);
}

public void testPreconditions() {
    assertNotNull(getActivity().findViewById(com.example.blah.R.id.mapview));
}

// This method gives me the following error message: java.lang.SecurityException: Injecting to another application requires INJECT_EVENT permission
public void testTap1() {
    final MyMapActivity m = getActivity();
    final MapView mapView = (MapView) m.findViewById(com.example.blah.R.id.mapview);

    getInstrumentation().waitForIdleSync();
    getInstrumentation().sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 1, 0, 0));

    assertTrue(true);    // this doesn't execute

}

// junit.framework.AssertionFailedError: Click can not be completed! Something is in the way e.g. the keyboard
public void testTap2() {
    final MyMapActivity m = getActivity();
    final MapView mapView = (MapView) m.findViewById(com.example.blah.R.id.mapview);

    // Robotium
    Solo solo = new Solo(getInstrumentation(), m);
    solo.clickOnScreen(1,1);

    assertTrue(true);    // this doesn't execute
}


// This method gives me the following error message: java.lang.SecurityException: Injecting to another application requires INJECT_EVENT permission
public void testTap3() {
    final MyMapActivity m = getActivity();
    final MapView mapView = (MapView) m.findViewById(com.example.blah.R.id.mapview);

    TouchUtils.tapView(this, mapView);

    assertTrue(true);    // this doesn't execute
}

}

2 个答案:

答案 0 :(得分:0)

您正在获得安全性异常,这通常在您尝试与不允许与之交互的应用程序进行交互时发生。典型情况是,受测试的应用程序打开一个属于另一个应用程序的Activity。在Android测试项目(AndroidManifest.xml)中,您可以定义要测试的包。 MapView是该软件包的一部分吗?

/ Renas

答案 1 :(得分:0)

当您尝试“触摸”正在测试的进程的子进程时,会发生此错误。

在您的示例中,我认为您的obtain()方法正在创建一个触摸事件,该事件实际上会与通知栏进行交互 - 这不属于您的应用程序。

在可能的情况下,更安全的互动方式是使用TouchUtils.clickView()

我想在您的实例中,您正在测试单个视图的触摸,因此在发送触摸事件之前,在TestCase内找到视图的顶部,左侧,宽度和高度可能是值得的。< / p>