2010-06-21 13 views
12

Ich muss Menüfunktionalität durch Komponententests abdecken, jedoch habe ich Schwierigkeiten, Menüobjekt zu erhalten.So testen Sie Menü

Nach Testfall ausfällt (MMENU ist null):

sendKeys(KeyEvent.KEYCODE_MENU); 
mMenu = (Menu) mActivity.findViewById(com.###.###.R.id.main_menu); 
assertNotNull(mMenu); 

Bitte Beratung. Vielen Dank.

Antwort

22

Ich lief in das gleiche Szenario und kam mit der folgenden (sehr einfach) Lösung in meiner Implementierung von ActivityInstrumentationTestCase up:

... 
ActivityMonitor am = getInstrumentation().addMonitor(LoginActivity.class.getName(), null, false); 

// Click the menu option 
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); 
getInstrumentation().invokeMenuActionSync(mActivity, R.id.logout, 0); 

Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000); 
assertEquals(true, getInstrumentation().checkMonitorHit(am, 1)); 
a.finish(); 
... 

Dieser Code-Snippet macht drei Dinge:

  1. Klicks der Menüoption,
  2. Stellt sicher, dass wir zu der entsprechenden Aktivität wechseln, nachdem auf die Menüoption geklickt wurde, und
  3. beendet die Aktivität das wurde begonnen (sehr wichtig für die folgenden Tests).

Ich hoffe, das hilft.

+0

Dies war eine nützliche Antwort und ein Code-Snippet, am wichtigsten ist, dass Sie zuerst 'KeyEvent.KEYCODE_MENU' senden müssen, bevor Sie die Menüaktion aufrufen. Im Nachhinein ist es offensichtlich, denke ich - Sie müssen das Menü anzeigen lassen, bevor Sie eines seiner Elemente aufrufen können. –

+1

FWIW Ich benutze getInstrumentation(). InvokeMenuActionSync() ohne vorherigen Aufruf von sendKeyDownUpSync() und es funktioniert auch gut. Siehe die Antwort auf diese Frage: http://stackoverflow.com/questions/5209154/test-menu-items – karni

+0

Ich beobachtete, dass der Aufruf von SendKeyDownUpSync notwendig ist, wenn Sie unter Bedingungen, die das Ergebnis der Arbeit sind, testen möchten In onPrepareOptionMenu ausgeführt, gibt invokeMenuActionSync true zurück.Ohne den Aufruf wurde onPrepareOptionsMenu nicht aufgerufen. – mtotschnig

2

Was genau möchten Sie testen? Diese Menüpunkte machen die richtige Aktion?

Sie können Activity.openOptionsMenu() aufrufen, um das Menü zu öffnen und einen Verweis auf das Menü zu erhalten, indem Sie eine der onMenu-Methoden überschreiben. An diesem Punkt können Sie Menu.performIdentifierAction verwenden, um Menüelemente auszuwählen.

+1

Ja, ich muss überprüfen, dass alle Menü- und Untermenüpunkte korrekte Aktionen ausführen. sendKeys (KeyEvent.KEYCODE_MENU) funktioniert korrekt und ich kann Menü auf Emulator sehen (ich kann es nicht sehen, wenn ich Activity.openOptionsMenu()) aufrufen. Meinen Sie, ich muss onMenuOpened in Ziel-App überschreiben und Menü Referenz innerhalb der Aktivität speichern? Vielleicht gibt es eine Möglichkeit, Zielanwendung nicht zu berühren? – cement

2

Wenn Sie UI-, System- oder Funktionstests durchführen möchten, würde ich Ihnen empfehlen, Robotium zu verwenden. Dann können Sie einfach sendKey (Solo.MENU) verwenden und dann mit clickOnText() oder clickOnView() auf die Menüpunkte klicken. Wenn Sie das getan haben, können Sie richtiges Verhalten geltend machen. Nur zu behaupten, dass es nicht null sein sollte, ist nicht genug. Sie sollten Robtium überprüfen, dessen Art und Weise besser geeignet ist, um solche Dinge zu testen.

+0

+1. Habe gerade angefangen, es zu benutzen. Sieht sehr praktisch aus. – alehro

1
Activity act =launchActivity(intent); 

    MenuBuilder builder=new MenuBuilder(mInst.getTargetContext()); 

    act.onCreateOptionsMenu(builder); 



    act.onPrepareOptionsMenu(builder); 

    Log.i(TAG, "BuilderSize: "+builder.size()); 
    int visible=0; 
    for(int i=0;i<builder.size();i++) 
    { 
     MenuItem item=builder.getItem(i); 

     if(item.isVisible()&& item.isEnabled()) 
     { 
      Log.i(TAG, item.getTitle().toString()); 
      visible++; 
     } 
    } 
    act.finish(); 
+0

MenuBuilder kann nicht in einen Typ aufgelöst werden! –

0

Verwenden Sie Instrumente, um das Drücken des Menüelements für Sie zu testen.

Hier ist ein Beispiel Testfall von mir, der das Menü "Einstellungen" aufruft, das eine andere Aktivität startet.

public void testCanGoToSettings() { 
    final MainActivity activity = getActivity(); 

    Instrumentation.ActivityMonitor am = getInstrumentation().addMonitor(ConfigureActivity.class.getName(), 
      null /* result */, true /* block */); 

    getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); 
    getInstrumentation().invokeMenuActionSync(activity, R.id.menu_settings, 0 /* flags */); 

      /* if not block in addMonitor() above, then comment out this... 
    Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000); 
    a.finish(); 
      */ 

}