2014-02-18 39 views
3

我需要使用Robolectric在Android應用程序的菜單中編寫測試。菜單的如何使用Robolectric在Android中測試菜單

的源代碼:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.exit: 
     this.finish(); 
     break; 
    default: 
     Toast.makeText(this, getString(R.string.errMsg), Toast.LENGTH_SHORT).show(); 
     break; 
    } 
    return super.onMenuItemSelected(featureId, item); 
} 

請幫忙寫測試

+1

沒有人會在這裏爲你寫測試,所以你自己嘗試一下,回來一個更詳細的問題。 – Egor

+1

提示:TestMenu,TestMenuItem。 – Daniel

+0

檢查:http://stackoverflow.com/questions/22417800/how-to-test-an-options-menu-items-visibility-in-robolectric – piotrek1543

回答

6

下面的例子應該是誰是入門Robolectric人一個很好的例子。它使用AndroidStudio下的Robolectric 3.0。

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 19) 
public class MainActivityTest { 
    @Test 
    public void shouldCloseActivity() { 
     MainActivity activity = Robolectric.setupActivity(MainActivity.class); 
     MenuItem menuItem = new RoboMenuItem(R.id.exit); 
     activity.onOptionsItemSelected(menuItem); 
     ShadowActivity shadowActivity = Shadows.shadowOf(activity); 
     assertTrue(shadowActivity.isFinishing()); 
    } 
} 
+0

爲什麼這裏我們需要ShadowActivity?我們可以調用activity.isFinishing()...不完全理解。 – lazexe

2

其實你應該避免使用避免使用RoboMenuItem,如果可能的話。您可以通過讓robolectric創建活動並使其可見,從而獲得活動創建的實際菜單。

MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().visible().get(); 

然後,您可以使用ShadowActivity獲取實際創建的菜單選項;

shadowOf(activity).getOptionsMenu() 

獲得實際的菜單項:

shadowOf(activity).getOptionsMenu().findMenuItem(...) 

然後,您可以通過實際的菜單項到onOptionsItemSelected。

RoboMenuItem只是一個虛擬的外觀,實際上它是由robolectric開發人員推薦的,如果可能的話可以避免。

相關問題