Actionbar Overflow中的单元测试菜单项

时间:2013-02-19 20:49:36

标签: java android unit-testing junit android-actionbar

我在Junit写一个简单的单元测试试图测试我的2个操作栏溢出菜单项的意图是否打开了正确的活动。我有问题,我的测试回来了

junit.framework.AssertionFailedError: expected:<true> but was:<false>  (**FIXED**)

我也在试图弄清楚如何验证活动是否已成功打开,这是推出的预期活动。

非常感谢任何帮助,示例和评论。

public void testThatMenuWillOpenSettings() {
    // Will be sending Key Event to open Menu then select something
    ActivityMonitor am = getInstrumentation().addMonitor(
            Settings.class.getName(), null, false);

    // Click the menu option
    getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
    getInstrumentation().invokeMenuActionSync(mActivity,
            com.example.app.R.id.menu_settings, 0);

    // If you want to see the simulation on emulator or device:
    try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }

    Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000);
    assertEquals(true, getInstrumentation().checkMonitorHit(am, 1)); 

      // Check type of returned Activity:
      assertNotNull(a);
      assertTrue(a instanceof Settings);

      a.finish();

}

我也在使用(ActivityInstrumentationTestCase2)进行单元测试。

1 个答案:

答案 0 :(得分:1)

您的测试代码非常好。 AssertionFailedError显示菜单点击模拟打开的Activity不是ActivityMonitor正在监视的Activity。根据名称menu_settings,我猜这是你的app的perference Activity,而你正在监视一个不同的WebView Main Activity,这就是为什么没有命中ActivityMonitor的原因。要解决此不一致问题,请更改ActivityMonitor以监视Activity_Pref_Settings,或更改菜单单击模拟以打开R.id.menu_webview_main。

  

我也在试图弄清楚如何验证活动是否已成功打开,这是推出的预期活动。

您可以使用instanceof检查返回活动的类型:

public void testThatMenuWillOpenSettings() {
  // Use false otherwise monitor will block the activity start and resulting waitForMonitorWithTimeout() return null: 
  ActivityMonitor am = getInstrumentation().addMonitor(Activity_Webview_Main.class.getName(), null, false);

  ... ...

  // If you want to see the simulation on emulator or device:
  try {
    Thread.sleep(1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }

  Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000);
  assertEquals(true, getInstrumentation().checkMonitorHit(am, 1));

  // Check type of returned Activity:
  assertNotNull(a);
  assertTrue(a instanceof Activity_Webview_Main);

  a.finish();

}

请注意,不需要对返回的活动进行进一步检查,但可以检查标题,标签文本等。