Verwirrt wie zu verwenden Mockito für ein android-test
Ich bin versucht, zu schreiben unit Tests für meine android-app, aber Schwierigkeiten haben, zu tun, was ich will, mit mockito. Dies wird in Verbindung mit Robolectric, die ich gut arbeiten und haben gezeigt, dass unit-tests arbeiten.
Möchte ich testen, ob oder nicht Sie mit einem Klick öffnen Sie eine neue Aktivität, je nachdem, ob es gibt einige bluetooth-Gerät verbunden. Offensichtlich, dort ist kein Gerät verbunden mit bluetooth in meinem test, aber ich möchte so tun, als ob es ist. Den Status der bluetooth-Verbindung ist gespeichert in meiner Application-Klasse. Es gibt keine öffentlich zugängliche Methode, diesen Wert zu ändern.
Also im Grunde der Logik in der app ist wie folgt:
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));
}
}
So, um dies zu testen habe ich Folgendes:
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()));
}
Also mein unit-test schlägt fehl, weil der Aufruf (in der Tätigkeit) zu isDeviceConnected gibt false zurück, obwohl ich dachte ich sagte es true zurück, mit dem mock-framework. Ich möchte, dass meine Tests haben diese Methode true zurück, wenn. Ist das nicht das, was mockito tut oder bin ich Total Irre, wie mockito?
- //listViewButton war setup in @Vor... bitte fügen Sie das code-snippet.
- Siehe auch Wie einrichten von Mockito zu mock-Klasse für Android unit-test
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist, wie mockito funktioniert, aber das problem ist: ist dein
listViewButton
mit IhremmockedApp
? Scheint nicht, da Sie bei der ErstellungmockedApp
im test-Methode und nie setzen Sie es überall. Mockito nicht verspotten die Methode ruft alle Instanzen derApplication
, nur aus dem, was Sie erklärt mock.Ich persönlich nicht wissen, wie android funktioniert mit der
Application
Klasse, aber Sie haben, um es irgendwo so listView verwenden Sie IhremockedApp
anstelle von dem, was es empfängt.BEARBEITEN
Nach den aktualisierten Frage-und schon verwandeln Sie Ihre
getApplication
in eine protected-Methode,spy
SielistViewButton
und die Rückkehr IhrermockedApp
. Das riecht ein wenig schlecht, aber es ist ein Weg, wenn Sie nicht Ihre Anwendung verspottet ObjektlistViewButton
.EDIT2
Beispiel für die Verwendung von spy in Ihrem test mit
BDDMockito
für die Lesbarkeit 🙂Dann der test sollte funktionieren wie erwartet. Aber ich verstärken: Verwenden Sie
spy
nur, wenn Sie können nicht, Spritzen Sie IhremockedApp
innen HomeActivity.Ihr verspottet version wird nicht genannt.
Sehen, dass der Anruf
getApplication()
? (unten). Das ist die Rückkehr eine echte Kopie Ihrer MyApplication Klasse, nicht Ihr verspottet version. Sie müssten zum abfangen desgetApplication()
aufrufen und übergeben Ihr verspottet Application-Objekt.Ich bin nicht sicher, es ist möglich, mit Mockito. Haben Sie versucht, anpassen der ShadowActivity#getApplication () - Methode?