【问题标题】:Mocking getActionBar() returns null模拟 getActionBar() 返回 null
【发布时间】:2017-04-02 08:41:20
【问题描述】:

我正在测试一项活动,我想模拟 getActionBar()。我已经尝试过按照通常的方式进行操作,即

ActionBar mActionBar;

@Before
public void setup() {
    initMocks(this);
    mActionBar = Mockito.mock(ActionBar.class);   
}

@Test 
public void someTest(){
    when(activity.getActionBar()).thenReturn(mActionBar);
}

但这似乎没有任何作用,因为当我尝试在getActionBar() 之后使用活动中的操作栏时,我仍然得到 NPE。

【问题讨论】:

  • 在提出问题时,如果遇到异常,请始终显示代码中发生这种情况的位置。我已经发布了一个答案,因为我猜你只是没有足够的嘲笑。

标签: java android mockito robolectric


【解决方案1】:

您可能在正在测试的代码中对模拟的ActionBar 调用其他方法,例如:

Tab tab = actionBar.getSelectedTab()

这将返回null。然后使用tab 将导致NPE。

这意味着你需要模拟更多,例如:

when(actionBar.getSelectedTab()).thenReturn(mock(Tab.class));

现在上面的例子将返回一个模拟的Tab

【讨论】:

    【解决方案2】:

    我假设您正在设置 Activity,因为它是在 Robolectric 教程中编写的。没有简单的方法来模拟活动代码本身内部的真实活动方法。

    我建议您创建 TestMyActivity 以扩展您的活动并且仅存在于测试源中。然后你可以覆盖getActionBar()(可能是getSupportActionBar()))。

    public class TestMyActivity extends MyActivity {
       @Override
       ActionBar getActionBar() {
          return mockedActionBar;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多