Android アプリの単体テストを作成しようとしていますが、mockito でやりたいことがうまくいきません。これは Robolectric と組み合わせて使用されており、私は問題なく動作しており、単体テストが機能することを実証しています。
Bluetooth デバイスが接続されているかどうかに応じて、ボタンが新しいアクティビティを開くかどうかをテストしたいと思います。明らかに、私のテストでは Bluetooth に接続されたデバイスはありませんが、あたかも存在するふりをしたいと思います。Bluetooth 接続の状態は Application クラスに保存されます。この値を変更するための公的にアクセス可能な方法はありません。
したがって、基本的にアプリのロジックは次のようになります。
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()));
}
したがって、モック フレームワークで true を返すように指示したと思っていたにもかかわらず、(アクティビティ内で) isDeviceConnected への呼び出しが false を返すため、単体テストは失敗します。ただし、テストでこのメソッドがtrueを返すようにしたいです。これはmockitoの機能ではありませんか、それともmockitoの使い方を完全に間違えていますか?