模拟getActionBar()返回null

时间:2017-04-02 08:41:20

标签: java android mockito robolectric

我正在测试一项活动,我想模仿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。

2 个答案:

答案 0 :(得分:1)

您可能在正在测试的代码中调用模拟@post.comments.build(params[:comment].permit(:text)) 上的其他方法,例如:

ActionBar

返回Tab tab = actionBar.getSelectedTab() 。然后使用null将导致NPE。

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

tab

现在上面的示例将返回一个模拟的when(actionBar.getSelectedTab()).thenReturn(mock(Tab.class));

答案 1 :(得分:0)

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

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

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