我需要通過單元測試覆蓋菜單功能,但是我努力獲得Menu對象。如何測試菜單
下面的測試案例失敗(mMenu爲null):
sendKeys(KeyEvent.KEYCODE_MENU);
mMenu = (Menu) mActivity.findViewById(com.###.###.R.id.main_menu);
assertNotNull(mMenu);
請指點。謝謝。
我需要通過單元測試覆蓋菜單功能,但是我努力獲得Menu對象。如何測試菜單
下面的測試案例失敗(mMenu爲null):
sendKeys(KeyEvent.KEYCODE_MENU);
mMenu = (Menu) mActivity.findViewById(com.###.###.R.id.main_menu);
assertNotNull(mMenu);
請指點。謝謝。
我就遇到了這個相同的情況下,在我的執行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();
...
的這段代碼做了三件事情:
我希望這會有所幫助。
你究竟想要測試什麼?那菜單項目做了正確的操作?
您可以調用Activity.openOptionsMenu()來打開菜單,並通過覆蓋其中一個onMenu方法來獲取菜單的引用。此時您可以使用Menu.performIdentifierAction選擇菜單項。
是的,我需要檢查所有菜單和子菜單項是否正在做正確的操作。 sendKeys(KeyEvent.KEYCODE_MENU)正常工作,我可以看到模擬器上的菜單(如果我打電話給Activity.openOptionsMenu(),我看不到它)。 你的意思是我需要重寫onMenuOpened在目標應用程序,並保存活動內的菜單引用? 也許有辦法不接觸目標應用程序? – cement 2010-06-21 13:39:29
如果你想做UI,系統或功能測試,我建議你使用Robotium。然後,您可以使用sendKey(Solo.MENU),然後使用clickOnText()或clickOnView()單擊菜單項。當你這樣做時,你可以主張正確的行爲。只是斷言它不應該是空的是不夠的。你應該檢查Robotium,在測試這樣的事情時使用它更適合使用。
+1。剛開始使用它。看起來很方便。 – alehro 2011-08-22 15:55:47
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();
MenuBuilder無法解析爲類型! – 2014-04-01 12:04:58
使用儀器測試爲您按下菜單項。
這是我的一個示例測試用例,它調用「設置」菜單,它啓動另一個活動。
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();
*/
}
這是一個有用的答案和代碼片斷,最重要的是它突出了在調用菜單操作之前必須先發送'KeyEvent.KEYCODE_MENU'。事後看來,很明顯,我猜 - 你必須先顯示菜單,然後才能調用其中的項目。 – 2011-05-31 19:43:41
FWIW我使用getInstrumentation()。invokeMenuActionSync(),而沒有事先調用sendKeyDownUpSync(),它工作得很好。看到這個問題的答案:http://stackoverflow.com/questions/5209154/test-menu-items – karni 2012-10-17 21:31:31
我觀察到,調用sendKeyDownUpSync是必要的,如果你想測試,如果在工作的結果條件下在onPrepareOptionMenu中完成,invokeMenuActionSync返回true。沒有調用,onPrepareOptionsMenu沒有被調用。 – mtotschnig 2013-10-15 21:17:49