我在爲Android項目編寫JUnit測試腳本。我打算測試的是一個活動的選項菜單項(您知道,通過按菜單鍵調用該菜單)。如何從活動獲取菜單引用
但是,在我們的項目中,菜單是從一些互聯網內容動態生成的。 最重要的是,Menu對象是我們活動對象中的一個私有變量。
現在我的問題是,我如何驗證這個菜單(驗證它的菜單項數量,每個項目上的文本等)。
我在爲Android項目編寫JUnit測試腳本。我打算測試的是一個活動的選項菜單項(您知道,通過按菜單鍵調用該菜單)。如何從活動獲取菜單引用
但是,在我們的項目中,菜單是從一些互聯網內容動態生成的。 最重要的是,Menu對象是我們活動對象中的一個私有變量。
現在我的問題是,我如何驗證這個菜單(驗證它的菜單項數量,每個項目上的文本等)。
您通常會這樣做的方式是在java中使成員包爲私有(無限定符),然後讓您的junit測試與託管菜單的類(可能是您的活動)在同一個java包中。
單元測試不必通過物理上共處於同一個包文件夾中,只要兩個類在運行時具有相同的包。
要測試菜單項的調用,您可以使用Instrumentation.invokeMenuActionSync()。
您將使用PhoneWindow獲得對菜單對象的引用。它有一個名爲「PanelFeatureState」的私有靜態最終類,該類包含一個名爲「MenuBuilder菜單」的字段,您需要反射才能訪問此類及其字段。 Menu inflator讀取xml資源文件並將菜單存儲在此對象中。
總結: PhoneWindow-> PanelFeaturestate-> MenuBuilder菜單
你可以參考使用從活動PhoneWindow: activity.getWindow()
由於PhoneWindow不是公共API,你需要使用反射。在我的情況下,我知道菜單項的文本,但我需要找到MenuItem的ANdroidId,所以我使用反射來獲取菜單項,然後閱讀它的androidId。 – 2013-07-26 07:37:13