Moyen facile de remplir jeu de résultats avec des données
Je veux maquette d'un jeu de résultats. Sérieusement.
Je suis un gros refactoring compliqué morceau de code qui est l'analyse des données à partir de ResultSet, et je veux que mon code se comportent de manière identique. Donc, j'ai besoin d'écrire un test unitaire de la pièce remaniée pour être en mesure de tester cette.
Après recherche sur google, je suis venu avec 2 idées:
- Utilisation EasyMock, écrire looooong se moquant de la séquence. TRÈS MAUVAISE solution: difficile d'ajouter des données initiales, difficile de changer les données, big test de débogage promices.
- L'utilisation d'Apache Derby ou HSQLDB pour créer dans la mémoire DB, remplir à partir du fichier ou de tableau de Chaîne de requête, avec certaines magique InMemoryDBUtils.de requête(sql). Ensuite utiliser ce jeu de résultats. Malheureusement, je n'ai pas trouvé magique InMemoryDBUtils d'écrire le test rapide :-). IBM article "unité Isolée tests de persistance avec Derby" semble un peu fine à propos de ce dont j'ai besoin, mais...
Deuxième approche semble un peu plus facile et beaucoup plus facile.
Qu'auriez-vous des conseils pour la création d'un tel simulacre? (malgré les médecins, bien sûr :-)? Suis-je en l'absence de un sourcil un peu d'argent de balle? Éventuellement, DBUnit est l'outil pour cela?
Vous devez vous connecter pour publier un commentaire.
DBUnit n'est pas de présenter un ensemble de résultats, à ma connaissance, mais il faudra bien vous aider à remplir votre dans la mémoire de la base de données.
Je dirais qu'un moqueur cadre est la mauvaise approche à ce point. Se moquant est sur les tests de comportement et d'interaction, et pas seulement les données de retour, de sorte qu'il sera probablement obtenir sur votre chemin.
Je serait plutôt de mettre en place un ensemble de résultats de l'interface ou de créer une dynamique de proxy d'un jeu de résultat de l'interface d'une classe qui implémente les méthodes de soins, sans avoir à mettre en œuvre la totalité des résultats. Vous trouverez probablement le maintien d'une classe aussi facile que de maintenir une mémoire de base de données (à condition que le jeu de données de test est compatible), et probablement plus facile à déboguer.
Vous pouvez sauvegarder cette classe avec DBUnit, où vous prenez un instantané de votre jeu de résultats avec dbunit, et ont dbunit le lire pendant le test à partir de xml, et vous avez votre mannequin ensemble de résultats de lire les données à partir de dbunit de classes. Ce serait une approche raisonnable si les données ont été légèrement complexe.
Je pencherais pour la mémoire de la base de données si les classes sont ainsi couplés qu'ils ont besoin de lire les données qui ont été modifiées dans le cadre de la même test. Même alors, je voudrais envisager d'utiliser une copie de la base de données réelle jusqu'à ce que vous avez réussi à tirer la dépendance en dehors.
Un simple proxy méthode de génération:
J'ai eu du succès avec la MockResultSet classe à partir d'ici: http://mockrunner.sourceforge.net/. Il vous permet de créer une classe qui implémente l'interface ResultSet, et vous permet de définir les valeurs de chaque colonne et de ligne.
Si vos méthodes de travail avec des jeux de résultats de taille raisonnable, vous devriez être en mesure de créer des tests permettant de renvoyer les valeurs dont vous avez besoin assez facilement.
Voici un exemple simple:
J'ai écrit quelque chose pour cette même affaire. Vous pouvez simuler le jeu de résultats à l'aide de Mockito. Vous pouvez ainsi en boucle sur la maquette lignes du jeu de résultats en se moquant du jeu de résultats.next() avec ce morceau de code.
Mockrunner pouvez charger un fichier CSV ou XML et créer un MockResultSet automatiquement. Il peut aussi se moquer de Connexion et de Déclaration, de sorte que tous vos JDBC choses simplement, sans même l'ajout d'un driver JDBC pour votre classpath.
Le cas échéant, vous pourriez vous prenez le jeu de résultats, vous avez maintenant à partir de votre véritable source de données, le sérialiser, et enregistrez le fichier. Ensuite, vous pouvez désérialiser l'ensemble des résultats pour chacun de vos tests unitaires, et vous devriez être bon d'aller.
Tant que vous n'êtes pas à l'appel de la plupart des
ResultSet
méthodes, je serais probablement il suffit de charger un fichier texte délimité dans un tableau à deux dimensions, et de mettre en œuvre les méthodes que j'ai réellement besoin, en laissant le reste à jeter unUnsupportedOperationException
(qui est la valeur par défaut de mise en œuvre de méthodes extraite dans mon IDE).