2017-04-02 76 views
0

我正在测试一个活动,我想模拟getActionBar()。我试着这样做通常的方式,那就是模拟getActionBar()返回null

ActionBar mActionBar; 

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

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

但是,这似乎并没有做任何事情,因为我还得到一个NPE,当我尝试使用在活动操作栏getActionBar()后。

+0

当提出问题,并且您收到异常时,请始终在代码中显示发生这种情况的位置。我已经发布了一个答案,因为我猜你只是没有充分嘲笑。 – john16384

回答

1

你可能会呼吁在代码中嘲笑ActionBar其他方法正在测试,例如像:

Tab tab = actionBar.getSelectedTab() 

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

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

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

现在上面的例子将返回嘲笑Tab

0

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

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

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