2010-06-21 23 views
12

我需要通過單元測試覆蓋菜單功能,但是我努力獲得Menu對象。如何測試菜單

下面的測試案例失敗(mMenu爲null):

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

請指點。謝謝。

回答

22

我就遇到了這個相同的情況下,在我的執行ActivityInstrumentationTestCase具有以下(很簡單)的解決方案提出了:

... 
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(); 
... 

的這段代碼做了三件事情:

  1. 點擊次數的菜單選項,
  2. 確保我們在點擊菜單選項後轉到相應的活動,並且
  3. 完成活動這已經開始了(對於下面的測試非常重要)。

我希望這會有所幫助。

+0

這是一個有用的答案和代碼片斷,最重要的是它突出了在調用菜單操作之前必須先發送'KeyEvent.KEYCODE_MENU'。事後看來,很明顯,我猜 - 你必須先顯示菜單,然後才能調用其中的項目。 – 2011-05-31 19:43:41

+1

FWIW我使用getInstrumentation()。invokeMenuActionSync(),而沒有事先調用sendKeyDownUpSync(),它工作得很好。看到這個問題的答案:http://stackoverflow.com/questions/5209154/test-menu-items – karni 2012-10-17 21:31:31

+0

我觀察到,調用sendKeyDownUpSync是必要的,如果你想測試,如果在工作的結果條件下在onPrepareOptionMenu中完成,invokeMenuActionSync返回true。沒有調用,onPrepareOptionsMenu沒有被調用。 – mtotschnig 2013-10-15 21:17:49

2

你究竟想要測試什麼?那菜單項目做了正確的操作?

您可以調用Activity.openOptionsMenu()來打開菜單,並通過覆蓋其中一個onMenu方法來獲取菜單的引用。此時您可以使用Menu.performIdentifierAction選擇菜單項。

+1

是的,我需要檢查所有菜單和子菜單項是否正在做正確的操作。 sendKeys(KeyEvent.KEYCODE_MENU)正常工作,我可以看到模擬器上的菜單(如果我打電話給Activity.openOptionsMenu(),我看不到它)。 你的意思是我需要重寫onMenuOpened在目標應用程序,並保存活動內的菜單引用? 也許有辦法不接觸目標應用程序? – cement 2010-06-21 13:39:29

2

如果你想做UI,系統或功能測試,我建議你使用Robotium。然後,您可以使用sendKey(Solo.MENU),然後使用clickOnText()或clickOnView()單擊菜單項。當你這樣做時,你可以主張正確的行爲。只是斷言它不應該是空的是不夠的。你應該檢查Robotium,在測試這樣的事情時使用它更適合使用。

+0

+1。剛開始使用它。看起來很方便。 – alehro 2011-08-22 15:55:47

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無法解析爲類型! – 2014-04-01 12:04:58

0

使用儀器測試爲您按下菜單項。

這是我的一個示例測試用例,它調用「設置」菜單,它啓動另一個活動。

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(); 
      */ 

}