Les tests unitaires Hibernate piloté par la demande?
Cela peut être une question naïve, mais je suis de nouveau à la junit et frameworks hibernate et je me demandais quelle est la meilleure façon d'aller sur l'unité de test d'une application qui est en grande partie des appels de mise en veille prolongée, ou si il est encore nécessaire de le faire?
Quelle est la meilleure pratique ici?
EDIT:
Le printemps semble être la grande suggestion ici. Malheureusement, cela peut être même un œil de trop à l'arrache pour un projet. Junit, Hibernate et Spring sont tout nouveau pour moi, et même si elles sont toutes les technologies que je veux obtenir sous ma ceinture, je pense que d'essayer de les intégrer dans un même projet peut être trop pour moi.
Des liens vers des tutoriels et/ou de réserver des suggestions sont les bienvenues.
- Je peux certainement sympathiser avec vous sur deux ou trois de Java, mot à la mode des technologies de beaucoup de mordre à la fois. Là, espérons-le fait que... :-/
- Je les recommande fortement. javabrains.koushik.org pour toute une nouvelle à spring, hibernate.
Vous devez vous connecter pour publier un commentaire.
Garder à l'esprit la différence entre les tests unitaires et les tests d'intégration.
Les tests unitaires doivent être des tests de code en dehors de toute dépendances. Ces dépendances sont moqués à l'aide d'un framework comme, par exemple, JMock.
Les tests d'intégration sont importants aussi, mais l'inconvénient majeur est qu'ils prennent beaucoup de temps à s'exécuter. Vous pouvez exécuter des milliers de vrais tests unitaires dans un couple de secondes, mais ce n'est pas la même chose avec les tests d'intégration.
En fonction de la taille de votre projet/équipe de développement, vous pourriez vouloir accorder la priorité à la véritable unité des essais sur des tests d'intégration. À la fois le style de tests sont importants, mais si vous êtes pressé pour les ressources, juste aller avec l'Unité de contrôle peut être une meilleure idée.
J'ai écrit une application par moi-même que l'objet de tests unitaires sur le Web (avec Spring MVC, c'est facile) et les couches de Service, ainsi que des objets du domaine. Mais j'ai quitté le DAO seule, parce que je n'ai pas envie d'écrire un tas de ralentir les tests d'intégration. Si j'avais plus de personnes sur le personnel je serais allé avec les tests d'intégration en tant que bien, mais dans ce cas je n'ai pas senti le temps passé en vaudrait la peine.
Comme pour les meilleures pratiques:
utiliser une base de données intégrée pour l'exécution de vos tests si possible, de sorte que vous n'avez pas besoin d'une déployés base de données relationnelle, juste pour lancer vos tests en local, ou sur votre serveur de build, si vous en avez un). De cette façon, vous ne devez pas (nécessairement) de vous soucier de faire reculer etc, vous pouvez seulement de recréer la base de données lorsque vous en avez besoin. Tests avec une base de données intégrée ne marche pas test particularités qui pourraient survenir lorsque vous utilisez votre base de données de production, mais il n'tester votre code, ce qui devrait suffire.
Vous pouvez également utiliser DbUnit, une extension de JUnit, facilement remplir la base de données avec les lignes et le mettre dans un état connu, avant d'exécuter votre Hibernate tests.
Les meilleures pratiques? J'utilise du Printemps et de faire tous mes tests transactionnelle. J'ai effectuer le test et la restauration de tous les changements, donc je ne modifie pas l'état de la base de données.
Je tiens à utiliser une mémoire de hsqldb pour les tests. Le processus pour chaque hibernate POJO est:
Pour DAOs, j'ai créer et de persister assez d'objets à tester avec précision les méthodes, puis exécutez les tests et supprimer les objets que nécessaire pour ne pas intefere avec d'autres tests.
Hibernate source comprend un grand nombre de tests unitaires, je vous recommande d'aller à travers ceux-ci et d'adapter une approche similaire.
Vous pouvez également regarder la CaveatEmptor laquelle l'échantillon de l'application développée pour le livre "Java Persistance avec Hibernate"
Si vous êtes en utilisant Hibernate pour le Domaine riche en modèles, tests Unitaires domaine logique est aussi simple que de tester une POJO et Hibernate ne pas obtenir sur votre chemin. Le seul inconvénient ici est, Pour bidirectionnelle mappages, vous pourriez avoir à définir l'objet sur les deux côtés pour les tests unitaires.
Des tests d'intégration avec la base de données n'est généralement pas fait pour la simple mappages. Il est toutefois suggéré dans le cas de l'exquise mappages comme Seul héritage de table etc. La seule chose à retenir ici, c'est que vous avez peut-être explicitement au ras de la base de données parfois.
Sûr, vous auriez test de l'unité de persistance de niveau si il n'était pas écrit en veille prolongée, n'est-ce pas?
Créer un compte tenu de la persistance de l'interface implémentée en utilisant Hibernate, instancier quelques exemples d'objets, effectuer des opérations CRUD, et demander JUnit pour affirmer que les opérations ont été couronnées de succès. De même que toute autre classe.
Vous pouvez utiliser de Printemps pour aider ici.
Il a une grande unit test framework, vous pouvez l'utiliser pour tester CRUD ops et puis annulation des modifications - parfait si vous n'avez pas avoir la capacité de recharger une base de données à chaque fois.
Écrire une simple couche qui transmet les demandes de mise en veille prolongée. Ensuite, utilisez un moqueur de la bibliothèque comme EasyMock ou JMock d'affirmer que votre mise en veille prolongée-placage couche est correctement appelé par vos classes de l'application. C'est bien décrit dans la partie complète JMock livre (défiler vers le bas pour le test de l'odeur de "tout est moqué").
Deux cas sont faciles à tester:
Lorsque cela est possible, d'effectuer vos calculs et des transformations dans les fonctions qui ne savent pas à propos de l'enregistrement ou le chargement des entités. Si vous pouvez faire ces fonctions pures, tellement mieux.
Pour les fonctions que seuls les enregistrer dans la base de données sans le lire, vous pouvez choisir de ne pas enregistrer lors de l'essai.
Le plus simple (plus) de façon à faire #2 est en ajoutant un
reallyUpdate
paramètre à la fonction, puis entourant chaque "enregistrer" appel avec:Pour moi, ce était le plus faible fruits mûrs.