Comment tester avec easymock Capture
J'ai le code suivant
Record rd = registerNewRecord();
<do some processing>
rd.setFinished(true);
updateRecord(rd);
La registerNewRecord méthode appelle la RecordDao méthode d'insertion, et updateRecord appelle la méthode de mise à jour sur le même DAO.
J'ai le texte suivant easymock code:
Capture<Record> insertRc = new Capture<Record>();
RecordDao.insert(capture(insertRc));
Capture<Record> updateRc= new Capture<Record>();
RecordDao.update(capture(updateRc));
Problème est que depuis que ci-dessus rd la même instance de l'Enregistrement qui a été inséré est en cours de mise à jour, la insertRc la Capture de l'objet en cours de mise à jour. Je ne peux donc pas affirmer que le drapeau fini est défini à false à l'heure d'insertion.
Ce que je fais mal?
OriginalL'auteur Nuno Furtado | 2009-12-01
Vous devez vous connecter pour publier un commentaire.
Si les références à l'intérieur
insertRC
etupdateRC
les deux font référence au même objetrd
et ce est modifiée au cours de laupdate
méthode, vous les verrez toujours que leRecord
objet est terminé. Cependant, vous pouvez tester le premier Capturé objet avant de leupdate
l'appel est fait.OriginalL'auteur DoctorRuss
Une idée est de cloner l'objet d'Enregistrement lors de l'acquisition.
Mettre en œuvre un
clone()
méthode dans votre journal de classe, puis de mettre en œuvre une Capture personnalisé comme suit:Et de changer votre code de test pour l'utiliser:
Si vous ne pouvez pas mettre en œuvre
clone()
pour une raison quelconque, votre Capture d'une classe pourrait tout simplement extraire l'information dont il a besoin (c'est à dire l'Enregistrement terminé drapeau) dans lesetValue
méthode et de les stocker.OriginalL'auteur Joe Daley
Capture ne sont pas la réponse. Le problème, c'est que votre code est la création d'un nouvel objet dans le registerNewRecord (ou alors je suppose). Il n'existe aucun moyen pour obtenir l'objet que vous créez avec
new
avant le code de test est terminée. Capture vous permettent de poser des questions à un objet créé/obtenu lors de l'exécution, APRÈS la méthode de test est terminée.Un autre problème avec votre test, c'est que votre test pour la méthode actuelle dépend du code de la
registerNewRecord()
méthode et probablement tout le code dans le constructeur de l'objet d'Enregistrement. Un moyen de briser cette dépendance et valider l'état intermédiaire de l'objet d'Enregistrement est d'écraser lesregisterNewRecord()
de la méthode et de l'avoir de retour d'une fantaisie. Ensuite, vous pouvez tester que le droit d'appels ont été apportées à l'Enregistrement de l'objet, et que votre code fonctionne correctement pour toutes les valeurs de retour possibles à partir de l'enregistrement de l'objet.Un effet secondaire positif, vous trouverez que votre test seulement des pauses quand il ya quelque chose de mal avec le code dans la méthode de test et ne brise jamais si le problème se trouve dans le Dossier du constructeur ou registerNewRecord. Vous voulez écrire un deuxième test pour le
registerNewRecord()
méthode pour s'assurer qu'il fonctionne correctement.OriginalL'auteur Gus