2010-12-07 16 views
0

J'essaie d'écrire des tests unitaires pour mon application Android. Le test particulier avec lequel j'ai des problèmes est juste de m'assurer que lorsque l'utilisateur tape quelque part sur mon MapView, l'application laisse tomber un marqueur où l'utilisateur a tapé. Mais tout ce que j'essaie me laisse avec un message d'erreur. Est-ce que quelqu'un sait comment écrire quelque chose comme ça?Comment déboguer l'activité Android/voir les événements

Voici ce que j'ai essayé jusqu'à présent:

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 
} 

}

Répondre

0

Vous obtenez des exceptions de sécurité, cela se produit généralement lorsque vous essayez d'interagir avec les applications que vous n'êtes pas autorisé à interagir avec. Un scénario typique est lorsque l'application testée ouvre une activité faisant partie d'une autre application. Dans votre projet de test Android (AndroidManifest.xml), vous définissez le package que vous souhaitez tester. Le MapView fait-il partie de ce paquet?

/Renas

+0

Dans le fichier AndroidManifest.xml pour MyMapActivityTest, j'ai . Ensuite, la classe à tester, MyMapActivity commence par "package com.example.blah". Toutefois, MapView lui-même fait partie du package com.google.android.maps. – jay

+0

Aussi, je ne sais pas si cela fait une différence, mais je ne cherche pas à tester une sous-classe de "android.app.Application". Mon programme est un couple de classes qui étendent tous "android.app.Activity". Merci. – jay

+0

C'est exactement le problème. Vous n'êtes pas autorisé à instrumenter contre com.google.android.maps car c'est une autre application. C'est pourquoi vous obtenez les exceptions de sécurité. Il n'y a pas moyen de contourner cela. Vous pouvez résigner l'application de cartes avec votre certificat et créer un nouveau projet de test pour cette application, mais vous ne pouvez pas l'utiliser avec votre projet de test existant comme vous l'avez indiqué com.example.blah comme paquet cible. – Renas

0

Cette erreur se produit lorsque vous essayez de « toucher » un enfant d'un processus autre que celui en cours de test.

Dans votre exemple, j'imagine que votre méthode obtain() crée un événement tactile qui interagirait réellement avec la barre de notification - qui n'appartient pas à votre application.

Une méthode d'interaction plus sûre, lorsque cela est possible, consiste à utiliser TouchUtils.clickView(). J'imagine que dans votre exemple vous testez le toucher d'une seule vue, il peut donc être utile de trouver le haut, la gauche, la largeur et la hauteur de la vue à l'intérieur de votre TestCase avant d'envoyer des événements tactiles.