Comment android test de l'unité et de se moquer d'une méthode statique
Salut j'espère vraiment que vous pourrez m'aider, je me sens comme j'ai été en tirant sur mes cheveux pendant des jours.
Je suis en train d'écrire des tests unitaires pour une méthode A. Méthode d'Un appel d'une méthode statique B. je veux maquette statique de la méthode B.
Je sais que cela a été demandé avant, mais j'ai l'impression d'Android a évolué depuis, et il doit y avoir moyen de faire une telle tâche simple, sans ré-écrire les méthodes que je veux tester.
Voici un exemple, d'abord la méthode que je veux tester:
public String getUserName(Context context, HelperUtils helper) {
if(helper == null){
helper = new HelperUtils();
}
int currentUserId = helper.fetchUsernameFromInternet(context);
if (currentUserId == 1) {
return "Bob";
} else {
return "Unknown";
}
}
Suivant la méthode statique je veux maquette:
public class HelperUtils {
public static int fetchUsernameFromInternet(Context context) {
int userid = 0;
Log.i("HelperUtils ", "hello");
return userid;
}
}
Dans d'autres langues, c'est facile, mais je ne peux pas le faire fonctionner sous Android.
J'ai essayé de Mockito, mais il semble que les méthodes statiques ne sont pas pris en charge
HelperUtils helper = Mockito.mock(HelperUtils.class);
Mockito.when(helper.fetchUsernameFromInternet(getContext())).thenReturn(1);
Cette erreur
org.mockito.des exceptions.en abuser.MissingMethodInvocationException
J'ai essayé Powermock mais je ne suis pas complètement sûr de ce qui est supporté par Android. J'ai réussi à obtenir powermock exécute à l'aide d'androidCompile dans mon gradle fichier mais j'ai cette erreur:
D'erreur:échec de l'Exécution de la tâche:app:dexDebugAndroidTest'. com.android.l'ide.commun.processus.ProcessException:
Pour ne pas mentionner PowerMockito.mockStatic(HelperUtils.class);
Ne retourne rien, donc je ne sais pas ce qui passe dans mon getUsername méthode!
Toute aide serait très appréciée.
Je ne sais pas tellement à propos de la tester dans d'autres langues, mais en Java,
static
est l'ennemi de l'essai.Vous pouvez avoir un coup d'oeil à PowerMock (github.com/jayway/powermock). C'est un framework de test vous permet de tester les cas difficiles.
PowerMockito donne juste PowerMock Mockito saveur de l'API, techniquement, ils font tous les deux la même
OriginalL'auteur James | 2015-08-18
Vous devez vous connecter pour publier un commentaire.
Méthodes statiques ne sont pas liées à n'importe quel objet de votre
helper.fetchUsernameFromInternet(...)
est le même (mais un peu déroutant)HelperUtils.fetchUsernameFromInternet(...)
- vous devriez obtenir un message d'avertissement du compilateur pour cette raisonhelper.fetchUsernameFromInternet
.Qui plus est, au lieu de
Mockito.mock
pour se moquer de méthodes statiques, vous devez utiliser:@RunWith(...)
,@PrepareForTest(...)
et puisPowerMockito.mockStatic(...)
- exemple complet est ici: PowerMockito maquette statique unique de la méthode et de l'objet de retourEn d'autres termes, se moquant des méthodes statiques (et aussi les constructeurs) est un peu délicat. La meilleure solution est:
si vous pouvez changer
HelperUtils
, faites que la méthode non-statique, et maintenant vous pouvez se moquerHelperUtils
avec l'habitudeMockito.mock
si vous ne pouvez pas modifier
HelperUtils
, créer une classe wrapper qui délègue à l'origineHelperUtils
, mais qui n'ont passtatic
méthodes, et puis aussi l'utilisation d'habitudeMockito.mock
(cette idée est parfois appelé "ne pas se moquer de types qui ne vous appartient pas")OriginalL'auteur iirekm
J'ai fait de cette façon en utilisant PowerMockito.
Je suis en utilisant
AppUtils.class
, il contient plusieurs méthodes statiques et les fonctions.Fonction statique:
Cas de Test:
Edit 1:
Ajouter des importations suivantes:
Espère que cela peut vous aider.
J'ai mis à jour la réponse. S'il vous plaît laissez-moi savoir.
OriginalL'auteur Hiren Patel