Confus comment utiliser Mockito pour android test

Je suis en train d'écrire un test unitaire pour mon application android, mais ont du mal à faire ce que je veux avec mockito. Ce est utilisé en conjonction avec Robolectric que j'ai fonctionne très bien et ont démontré que les tests unitaires du travail.

Je veux tester si oui ou non un bouton permet d'ouvrir une nouvelle activité, selon qu'il y a quelques périphérique bluetooth connecté. Évidemment, aucun périphérique n'est connecté avec le bluetooth dans mon test, mais je tiens à faire semblant comme s'il en est. L'état de la connexion bluetooth est stocké dans ma classe d'Application. Il n'est pas accessible au public méthode pour modifier cette valeur.

Donc, fondamentalement, la logique de l'application est comme ceci:

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));
   }
}

Afin de tester ce que je n'ai suivantes:

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()));
}

Donc mon test de l'unité échoue parce que l'appel (de l'activité) à isDeviceConnected renvoie la valeur false, même si je pensée je l'ai dit à retourner true avec la simulation de cadre. Je veux que mon test de cette méthode retourne true si. N'est-ce pas ce que mockito ne ou suis-je totalement tort sur la façon d'utiliser mockito?

//listViewButton a été mis en place dans le @Avant... merci d'ajouter ce bout de code.
Voir aussi Comment mettre en place Mockito, à se moquer de classe pour Android unité de test

OriginalL'auteur Matt Wolfe | 2012-12-20