我正在尝试为我的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
}
}
答案 0 :(得分:0)
您正在获得安全性异常,这通常在您尝试与不允许与之交互的应用程序进行交互时发生。典型情况是,受测试的应用程序打开一个属于另一个应用程序的Activity。在Android测试项目(AndroidManifest.xml)中,您可以定义要测试的包。 MapView是该软件包的一部分吗?
/ Renas
答案 1 :(得分:0)
当您尝试“触摸”正在测试的进程的子进程时,会发生此错误。
在您的示例中,我认为您的obtain()
方法正在创建一个触摸事件,该事件实际上会与通知栏进行交互 - 这不属于您的应用程序。
在可能的情况下,更安全的互动方式是使用TouchUtils.clickView()
。
我想在您的实例中,您正在测试单个视图的触摸,因此在发送触摸事件之前,在TestCase
内找到视图的顶部,左侧,宽度和高度可能是值得的。< / p>