2012-01-11 62 views
6

如何在android中爲操作欄項目編寫junit測試用例?獲得其參考以執行點擊事件的任何方式?任何方式來獲取Android的Junit測試的Actionbar項目的參考?

+0

有同樣的問題,而試圖測試我的動作條列表 - 導航。 – 2012-08-13 14:12:09

+0

實際上,您在Android中正常使用引用的方式是相同的,唯一要記住的是測試運行在不同的名稱空間中,因此您必須使用原始應用程序的完整名稱空間。 – gipi 2013-06-04 09:23:19

回答

0

我通過創建自己的自定義MenuItem類並手動爲Activity調用onOptionsItemSelected(MenuItem項)來解決問題。 任何其他適當的方式來做這個Junit測試?

0

我正在使用ActionBar提供的ActionBarSherlock並遇到此問題。我發現做到這一點,最好的辦法是:

  1. 在您的測試活動保留onCreateOptionsMenu通過菜單對象的實例,使這個訪問你的測試用例。
  2. 在您的測試情況下,你需要將儀器的引用,菜單讓您通過ID來選擇菜單項:

    private void clickOnMenuItem(int menuItemId, Instrumentation instruments, Menu menuInstance) { 
    final Integer itemId = menuItemId; 
    final Menu menu = menuInstance; 
    instruments.runOnMainSync(new Runnable() { 
        @Override 
        public void run() { 
         menu.performIdentifierAction(itemId, 0); 
        } 
    }); 
    

    }

3

您可以模擬點擊的動作條項目像這樣:

public void testButton(){ 
    final View view = activity.findViewById(com.example.R.id.button1); 
    activity.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      view.requestFocus(); 
      view.callOnClick(); 
     } 
    }); 
} 
+0

只是一個觀察:'callOnClick()'是在Api級別15中添加的,所以它在舊版本中不可用。另一種方法是'performClick()'。 – gipi 2013-06-04 09:40:42

1

在以下示例中,我能夠檢索導航選項卡按鈕o f操作欄(本機或ActionBarSherlock)。然後我點擊他們TouchUtils.clickView():

try { 

// Trying to get the ActionBar view '@id/android:action_bar_container' dynamically 
int resId = 
a.getResources().getIdentifier("action_bar_container", "id", "android"); 
View actionBarContainer = a.findViewById(resId); 

// The class 'com.android.internal.widget.ActionBarContainer' must be in 
// the classpath of this test project to be able to call 
// the method 'getTabContainer' at runtime 
Method getTabContainer = 
com.android.internal.widget.ActionBarContainer.class.getMethod("getTabContainer", 
(Class<?>[]) null); 

HorizontalScrollView tabContainer = 
(HorizontalScrollView) getTabContainer.invoke(actionBarContainer, (Object[]) null); 
return ((ViewGroup) tabContainer.getChildAt(0)).getChildAt(tabIndex); 

} catch (Exception e) { 

// Trying with SherlockActionBar 
com.actionbarsherlock.internal.widget.ActionBarContainer actionBarContainer = 
(com.actionbarsherlock...) a.findViewById(R.id.abs__action_bar_container); 

HorizontalScrollView tabContainer = 
(HorizontalScrollView) actionBarContainer.getTabContainer(); 
return ((ViewGroup) tabContainer.getChildAt(0)).getChildAt(tabIndex); 

} 
} 
+0

我在瀏覽視圖層次結構時遇到了類似的想法,並且因爲包名稱而出現問題,所以android名稱似乎很有用,所以非常感謝。另請注意,如果有一些視圖顯示在您的應用程序上,您也可以通過這種方式訪問​​它們,只需找出正確的軟件包名稱即可。看來你也可以通過這種方式訪問​​通知欄元素。 – PSIXO 2014-04-03 13:58:19

1

使用robotium.jar庫

import com.jayway.android.robotium.solo.Solo; 

private Solo solo; 
this.solo = new Solo(getInstrumentation(),getActivity()); 
//R.id.menu_action_signup Menu Iten id. 
this.solo.clickOnView(this.solo.getView(R.id.menu_action_signup)); 
相關問題