我正在尝试为我的 android 应用程序编写一个单元测试,但是在使用 mockito 做我想做的事情时遇到了麻烦。这与 Robolectric 结合使用,我工作得很好,并且已经证明单元测试有效。
我想根据是否连接了一些蓝牙设备来测试按钮是否会打开新活动。显然,在我的测试中没有连接蓝牙的设备,但是我想假装好像有。蓝牙连接的状态存储在我的应用程序类中。没有可公开访问的方法来更改此值。
所以基本上应用程序中的逻辑是这样的:
HomeActivity.java:
//this gets called when the button to open the list is clicked.
public void openListActivity(View button) {
MyApplication myApplication = (MyApplication) getApplication();
if (myApplication.isDeviceConnected() {
startActivity(new intent(this, ListActivity.class));
}
}
所以为了测试这一点,我做了以下事情:
TestHomeActivity.java:
@Test
public void buttonShouldOpenListIfConnected() {
FlexApplication mockedApp = Mockito.mock(MyApplication.class);
Mockito.when(mockedApp.isDeviceConnected()).thenReturn(true);
//listViewButton was setup in @Before
listViewButton.performClick();
ShadowActivity shadowActivity = Robolectric.shadowOf(activity);
Intent intent = shadowActivity.getNextStartedActivity();
assertNotNull(intent); //this fails because no new activity was opened. I debugged this and found that isDeviceConnected returned false.
ShadowIntent shadowIntent = Robolectric.shadowOf(intent);
assertThat(shadowIntent.getComponent().getClassName(), equalTo(ListActivity.class.getName()));
}
所以我的单元测试失败了,因为对 isDeviceConnected 的调用(在活动中)返回 false,即使我认为我告诉它使用模拟框架返回 true。我希望我的测试让这个方法返回 true。这不是 mockito 所做的,还是我完全误会了如何使用 mockito?