Maquette privé de la méthode de la même classe qui est en train d'être testé
J'ai une classe Java nommée, MyClass
, que je veux faire des tests avec JUnit. La méthode publique, methodA
, que je veux tester les appels à une méthode privée, methodB
, dans la même classe pour déterminer le conditionnel chemin à suivre. Mon but est d'écrire des tests JUnit pour les différents chemins dans methodA
. Aussi, methodB
appels de service, donc je ne veux pas vraiment être exécuté quand je lance les tests JUnit.
Quelle est la meilleure façon de se moquer methodB
et de contrôle de son retour afin que je puisse tester les différents chemins pour "methodA'?
Je préfère utiliser JMockit lors de l'écriture se moque, je suis donc particulièrement intéressé par la réponse qui s'applique à JMockit.
Voici mon exemple de classe:
public class MyClass {
public String methodA(CustomObject object1, CustomObject object2) {
if(methodB(object1, object2)) {
//Do something.
return "Result";
}
//Do something different.
return "Different Result";
}
private boolean methodB(CustomObject custObject1, CustomObject custObject2) {
/* For the sake of this example, assume the CustomObject.getSomething()
* method makes a service call and therefore is placed in this separate
* method so that later an integration test can be written.
*/
Something thing1 = cobject1.getSomething();
Something thing2 = cobject2.getSomething();
if(thing1 == thing2) {
return true;
}
return false;
}
}
C'est ce que j'ai à ce jour:
public class MyClassTest {
MyClass myClass = new MyClass();
@Test
public void test_MyClass_methodA_enters_if_condition() {
CustomObject object1 = new CustomObject("input1");
CustomObject object2 = new CustomObject("input2");
// How do I mock out methodB here to return true?
assertEquals(myClass.methodA(object1, object2), "Result");
}
@Test
public void test_MyClass_methodA_skips_if_condition() {
CustomObject object1 = new CustomObject("input1");
CustomObject object2 = new CustomObject("input2");
// How do I mock out methodB here to return false?
assertEquals(myClass.methodA(object1, object2), "Different Result");
}
}
Merci!
Êtes-vous intéressé à la Easymock - Powermock solution? Sinon, je veux l'écrire pour vous.
Voir aussi stackoverflow.com/questions/250692/...
Voir aussi stackoverflow.com/questions/34571/...
OriginalL'auteur Kingand | 2013-10-31
Vous devez vous connecter pour publier un commentaire.
De donner la réponse que vous avez demandé (à l'aide de JMockit partielle moqueur):
Cependant, je tiens à pas vous recommandons de le faire comme ça. En général,
private
méthodes ne doivent pas être moqué. Au lieu de cela, se moquer de la réelle dépendance externe de votre unité sous test (leCustomObject
dans ce cas):Something
objet ne peut pas être instancié sans suite d'une chaîne de code hérité que des appels de plusieurs services. DepuismethodB
vérifie la valeur d'un champ en particulier surthing1
etthing2
, c'était plus facile de se moquer de sortirmethodB
et forcer un retour plutôt que de tenter de se moquer deSomething
ouCustomObject
.triste à dire, mais les Attentes de soutien pour se moquant des méthodes privées est supprimée depuis JMockit 1.23, vous devez utiliser une Maquette maintenant.
OriginalL'auteur Rogério
De ne pas être tenté de se moquer des méthodes privées, même si vous pouvez s'engager dans la ruse pour le faire à l'aide d'une moquerie de l'outil. Les membres privés sont des détails d'implémentation, ce qui devrait être libre de le modifier. Au lieu d'utiliser la non-API privée pour l'exercice de la classe. Si c'est gênant, envisager de passer le ennuyeux code dans une classe différente, si elle n'y est pas déjà, et utiliser l'injection de dépendance pour injecter un simulacre de mise en œuvre de l'importun code.
OriginalL'auteur Raedwald
Faire methodB un membre d'une catégorie distincte, et d'une salle de référence de cette classe dans
MyClass
.Personnellement, j'ai l'habitude de tester des méthodes publiques et de regarder les rapports de couverture pour s'assurer que tous les chemins ont été visités dans mes méthodes privées. Si j'ai vraiment besoin de tester une méthode privée, c'est une odeur qui nécessite un refactoring comme je l'ai ci-dessus.
Vous pouvez également utiliser la réflexion, mais je me sentirais sale de faire ça. Si vous voulez VRAIMENT la solution à ce laissez-moi savoir et je vais l'ajouter à cette réponse.
//Do Something
partie demethodA
. Je suis à la recherche d'un moyen de forcermethodA
pour entrer dans l'instruction if pour que je puisse tester le code. Je suis d'accord que si elle était en train de tester,methodB
, ce serait une indication que je peut-être besoin de revoir.OriginalL'auteur mikeslattery
OriginalL'auteur javaPlease42
Pour se moquer de la méthode privée, vous devez powermock
L'exemple de code sera comme ça, mais je n'ai pas l'exécuter.
methodB()
être privée. Il y a d'autres moyens de PowerMock d'appeler des méthodes privées qui prennent un argument de type chaîne pour le nom de la méthode. Il obtient un peu laid, tho.Vous avez raison, je donne l'exemple pour ne pas les méthodes privées. Mais ce lien pourrait vous aider. stackoverflow.com/questions/7803944/...
OriginalL'auteur Lifecube