2010-12-07 13 views
0

Androidアプリケーションの単体テストを作成しようとしています。私が問題を抱えている特定のテストは、ユーザーがMapViewのどこかをタップすると、アプリケーションがタップした場所のマーカーをドロップすることを確認することです。しかし、私が試してみるすべてのものは何らかのエラーメッセージを私に残す。誰もこのようなものを書く方法を知っていますか?Androidのアクティビティ/ビューイベントをデバッグする方法

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

をあなたは、あなたがと対話することが許可されていないアプリケーションと対話しようとすると、一般的に起こるセキュリティ例外を取得している:ここで

は、私がこれまで試したものです。一般的なシナリオは、テスト対象のアプリケーションが別のアプリケーションの一部であるアクティビティを開くときです。 Androidテストプロジェクト(AndroidManifest.xml)では、テストするパッケージを定義します。 MapViewはそのパッケージの一部ですか?

/Renas

+0

MyMapActivityTestのAndroidManifest.xmlファイルには、があります。テスト対象のクラスMyMapActivityは、 "package com.example.blah"で始まります。ただし、MapView自体はcom.google.android.mapsパッケージの一部です。 – jay

+0

また、違いがあるかどうかはわかりませんが、 "android.app.Application"のサブクラスをテストしようとしていません。私のプログラムは、 "android.app.Activity"を拡張したクラスです。ありがとう。 – jay

+0

それはまさに問題です。 com.google.android.mapsを他のアプリケーションとして使用することは許可されていません。そのため、セキュリティの例外が発生しています。その周りに道はない。マップアプリケーションを証明書で辞任し、そのアプリケーション用の新しいテストプロジェクトを作成することはできますが、com.example.blahをターゲットパッケージとして指定したので、既存のテストプロジェクトと一緒に使用することはできません。 – Renas

0

あなたがテスト対象以外のプロセスの子を試してみて、「タッチ」と、このエラーが発生します。

あなたの例では、obtain()メソッドが実際に通知バーと相互作用するタッチイベントを作成していると思います。これはアプリケーションによって所有されていません。

可能であれば、より安全なやりとりの方法は、TouchUtils.clickView()を使用することです。

タッチイベントを送信する前に、TestCase内のビューの上部、左、幅、高さを調べる価値があるかもしれません。

関連する問題