EasyMock attend privé appels de méthode
Permet de dire que j'ai une méthode qui ressemble à ceci:
public static String[] parseFoo(Foo anObject){
Foo anotherObject = parseFoo2(anObject);
...
}
private static Foo parseFoo2(Foo anObject){
...
}
et les deux méthodes sont dans la même classe. parseFoo2 est juste une méthode d'aide qui aide parseFoo obtenir des trucs fait. Je suis en train de tester la méthode parseFoo. Est-il quelqu'un dans EasyMock que je peux spécifier une valeur de retour sur que privé d'un appel de méthode pour parseFoo2 aime la façon dont je peux préciser exemple les appels de méthode pour un objet avec
EasyMock.createMock(...);
anObject.expect(...).andReturn(...);
parce que je veux tester la méthode publique, mais je ne veux pas avoir à aller dans le privé de la méthode et de tester la mise en œuvre à l'intérieur.
Grâce
OriginalL'auteur KWJ2104 | 2012-08-06
Vous devez vous connecter pour publier un commentaire.
Si vous trouvez que vous doit simulacre d'une méthode privée, alors vous pouvez utiliser
PowerMock.expectPrivate()
. EasyMock n'est pas capable de se moquer de méthodes privées.OriginalL'auteur Makoto
Ne pas le faire.
L'une des pierres angulaires d'une bonne unité de test est qu'il doit compter aussi peu que possible sur les détails d'implémentation. Se moquant d'un privé méthode est exactement ça.
Pourquoi?
Parce que vos tests unitaires très fragile. Considérons une situation où vous revenir à ce code en une semaine et décider que vous n'avez pas vraiment besoin de la méthode parseFoo2 et que vous voulez vraiment aux commandes de son code. Ou que vous voulez fractionner cette méthode en deux ou plus des méthodes. Toutes très valables refactoring pratiques- mais ils vont briser l'unité de test!
Vous ne voulez pas être en train de chasser les tests unitaires à chaque fois que vous faites un simple comme ça. Par conséquent, il est considéré comme une mauvaise pratique pour se moquer des méthodes privées.
Je ne suis pas d'accord. À partir d'un point de vue pragmatique, les tests méthodes privées avec un haut degré de granularité ne vous empêche d'facilement la refactorisation de votre code. Je suis d'accord que la complexité augmente, il doit être pris en compte pour les pièces qui doivent être analysés séparément. Les Classes doivent être considérés dans ce cas. à partir d'un point de vue philosophique, je dirais qu'une partie privée d'une classe n'est pas une Unité qui doit être testé. C'est un détail d'implémentation, alors que les tests devraient refléter les exigences de l'objet sous test, pas son fonctionnement interne.
Je suis d'accord, ce qui est parfois, vous avez besoin de se moquer d'une méthode privée - par exemple, dans les cas où la dérision de l'interne (privé), la logique est très complexe et manque le point de le tester. Mais ces cas sont relativement rares et généralement point à un autre flot de conception. Peu importe, il ne tombe pas sur le cas d'utilisation de l'OP.
OriginalL'auteur Vitaliy
Si vous voulez toujours utiliser EasyMock, car il ne dépend pas de vous (dans une entreprise), vous pouvez utiliser la réflexion pour modifier le champ privé qui votre méthode retourne, ou tout domaine privé.
Vous pouvez avoir ces méthodes dans une classe d'assistance par exemple. Et de les utiliser en tant que de besoin.
Dans mon cas, parseFoo2 était dans une autre classe, mais j'avais besoin de modifier ce qu'il était de retour, en fin de compte privé champ statique de la classe à droite?Donc.. public static void helpMethodForStaticFiled(Classe<?> classe, String fieldName, Objet fieldValue) { Field " = de classe.getDeclaredField(fieldName); champ.setAccessible(true); champ.set(null, fieldValue); champ.setAccessible(false); } Et maintenant, si j'ai une private static MyField myField dans la classe Maclasse, je fais quelque chose comme: helpMethodForStaticFiled(MyClass.class, "myField", nouvelle MyField());
OriginalL'auteur dalvarezmartinez1