2017-09-28 3 views
1

J'essaie de vérifier que les extras spécifiques sont ajoutés à l'intention, mais tout le temps je reçois null pour l'intention dans l'unité de test Android. J'ai la classe suivante qui ont besoin d'être testé:Intention extras dans l'unité de test Android Mockito

public class TestClass extends SomeNotifier { 
     private Intent mIntent = new Intent("testintent"); 

     public TestClassConstructor(Context context) { 
      super(context); 
     } 

     @Override 
     public void notifyChange() { 
      mIntent.putExtra("Key one", 22); 
      mIntent.putExtra("Key two", 23); 
      mIntent.putExtra("Key three", 24); 
      getContext().sendBroadcast(mIntent); 
     } 
    } 

Et le test est la suivante (j'ai essayé avec mockIntent aussi bien, mais le résultat est le même, encore une fois les extras sont nuls):

@RunWith(MockitoJUnitRunner.class) 
public class TestClassTest { 

    @Mock 
    Context mMockContext; 

    @Test 
    public void sendBroadcastTest() { 

    ArgumentCaptor<Intent> argument = ArgumentCaptor.forClass(Intent.class); 

    TestClass testClassNotifier = new TestClass (mMockContext); 
    testClassNotifier.notifyChange(); 
    verify(mMockContext).sendBroadcast(argument.capture()); 


Intent intent = argument.getValue(); 
//THE INTENT IS NULL 
Assert.assertTrue(intent.hasExtra("Key one")); 

    } 
} 

Avez-vous une suggestion à faire pour que ce test fonctionne? Merci d'avance

Répondre

0

Intent et d'autres classes d'exécution Android comme Context sont, par défaut, uniquement disponibles sur les combinés et émulateurs Android physiques. Pour les tests unitaires locaux, vous disposez d'une version stubbed de l'environnement d'exécution où les méthodes Intent etc. renverront null par défaut. Voir this question pour une explication.

Cela signifie que votre test en cours est en cours de vérification par rapport à une version stubbed de Intent qui renvoie null pour tous les appels de méthode par défaut. Il existe plusieurs façons de contourner ce problème: vous pouvez convertir le test en un test unitaire instrumenté, ce qui signifie que vous devrez l'exécuter sur un vrai téléphone ou un émulateur. Alternativement, vous pouvez envelopper la classe Intent avec une classe que vous contrôlez.

Peut-être la meilleure solution est d'utiliser un cadre comme Robolectric. Cela vous fournira des doubles de test de travail (appelés ombres) de classes Android importantes comme Intent pour les tests unitaires locaux qui s'exécutent dans votre IDE.

Une fois que vous avez soigneusement installé Robolectric vous suffit d'ajouter ce qui suit pour faire votre travail de test:

@RunWith(RobolectricTestrunner.class) 
public class TestClassTest { 

En aparté, s'il vous plaît assurez-vous que vous utilisez les dépendances correctes pour Mockito sur Android:

testCompile 'org.mockito:mockito-core:2.8.9' 
androidTestCompile 'org.mockito:mockito-android:2.8.9'