se moquer ou de stub pour les chaînes d'appel
protected int parseExpire(CacheContext ctx) throws AttributeDefineException {
Method targetMethod = ctx.getTargetMethod();
CacheEnable cacheEnable = targetMethod.getAnnotation(CacheEnable.class);
ExpireExpr cacheExpire = targetMethod.getAnnotation(ExpireExpr.class);
//check for duplicate setting
if (cacheEnable.expire() != CacheAttribute.DO_NOT_EXPIRE && cacheExpire != null) {
throw new AttributeDefineException("expire are defined both in @CacheEnable and @ExpireExpr");
}
//expire time defined in @CacheEnable or @ExpireExpr
return cacheEnable.expire() != CacheAttribute.DO_NOT_EXPIRE ? cacheEnable.expire() : parseExpireExpr(cacheExpire, ctx.getArgument());
}
qui est la méthode de test ,
Method targetMethod = ctx.getTargetMethod();
CacheEnable cacheEnable = targetMethod.getAnnotation(CacheEnable.class);
J'ai, à se moquer de trois CacheContext,Méthode et CacheEnable.
Est-il une idée pour faire le test cas beaucoup plus simple?
Vous devez vous connecter pour publier un commentaire.
Mockito peut gérer enchaîné talons:
Autant que je sache, la première méthode de la chaîne renvoie une maquette, qui est mis en place pour retourner votre valeur sur le deuxième enchaîné appel de méthode.
Mockito les auteurs de noter que ce devrait être utilisé uniquement pour le code de legs. Une meilleure chose à faire autrement, c'est pousser le comportement dans votre CacheContext et de fournir toutes les informations dont il a besoin pour faire le travail lui-même. La quantité d'informations que vous êtes en tirant à partir CacheContext suggère que votre classe a envie de fonctionnalité.
Foo foo=mock(Foo.class); Bar bar=mock(Bar.class); when(foo.getBar()).thenReturn(bar); when(bar.getName()).thenReturn("deep")'
. À mes yeux, c'est facile à lire et ne nécessite pas la compréhension de la notion de "PROFONDEUR" buter. (Btw, j'aime Mockito.)RETURNS_SELF
, puisque les docs découragerRETURNS_DEEP_STUBS
RETURNS_SELF
est utile si vous êtes en train de créer les constructeurs (qui normalement retourner eux-mêmes de sorte que vous pouvez continuer à ajouter des choses). Dans le cas des OP cas, il ne correspond pas à la signature ou de l'intention.RETURNS_DEEP_STUBS
est la bonne chose à utiliser, surtout si l'intention est d'envelopper quelque chose dans un test alors que le refactoring. Les docs ne fait pas de découragerRETURNS_DEEP_STUBS
; ils découragent l'anti-modèle, ce qui nécessite en premier lieu (violation de la Loi de Déméter, aka envie de fonctionnalité).Ma suggestion de faire de votre cas de test le plus simple est de revoir votre méthode.
À chaque fois que je me retrouve à avoir de la difficulté à tester une méthode, c'est une odeur de code pour moi, et je me demande pourquoi est-il difficile à tester. Et si le code est difficile à tester, il est sans doute difficile à utiliser et à entretenir.
Dans ce cas, c'est parce que vous avez une méthode de la chaîne qui va de plusieurs niveaux de profondeur. Peut-être passer dans le ctx, cacheEnable, et cacheExpire en tant que paramètres.
J'ai trouvé JMockit plus facile à utiliser sna basculé complètement. Voir des cas de test à utiliser:
https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java
Ici, j'ai simulé à l'écart de l'Activité de la classe de base, ce qui est à venir à partir d'Android SKD et complètement
écrasé. Avec JMockit vous pouvez vous moquer de thingis tha sont définitives, privé, abstrait ou tout autre chose.
Dans votre cas de test, il devrait ressembler à:
@Cascading
. Aussi, dans des cas comme cela, vous voudrez probablement utiliserNonStrictExpectations
au lieu deExpectations
, en supposant que les appels de méthodes fantaisie n'a pas besoin d'être vérifié.Juste au cas où vous êtes à l'aide de Kotlin. MockK ne dit rien à propos de l'enchaînement d'être une mauvaise pratique et facilement vous permet de faire des cette.