2017-01-16 1 views
4
@Rule 
public ActivityTestRule<LoginTestActivity> mLoginActivityTestRule = new ActivityTestRule<>(LoginTestActivity.class); 

@Test 
public void loginWithTwitter() throws Exception 
{ 
    mLoginActivityTestRule.getActivity().performLogin(); 
} 

La fonction performLogin ci-dessus fonctionne bien quand je cours à travers l'application normalement, mais quand je le lance dans un test unitaire je reçois cette exception redoutée:Test unitaire comprenant un toast dans le code de production ne

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

la ligne d'erreur est l'endroit où je montre un Toast sur le fil principal à l'aide:

Toast.makeText(getApplicationContext(), "Login Success!", Toast.LENGTH_LONG).show();

Pourquoi est-ce défaut quand je le lance comme un test unitaire? Je suppose qu'une ActivityTestRule s'exécute sur son propre thread en quelque sorte, et il n'est pas considéré comme le fil principal par Android. Comment puis-je le résoudre?

J'ai essayé de passer en pour l'utiliser comme contexte pour le Toast mais la même erreur se produit. Dois-je emballer chaque affichage toast dans un appel pour s'exécuter sur le thread UI explicitement?

Répondre

0

Il y a deux solutions:

  1. annoter le test avec l'annotation @UiThreadTest de la bibliothèque de soutien.

OU

  1. Appel mLoginActivityTestRule.runOnUiThread à courir seulement la partie de test sur thread d'interface utilisateur.

Espérons qu'une de ces solutions résout votre problème.