Pour faire des tests simples, se moquer de la couche d'accès à la base de données est parfaitement acceptable. Vous appelez getName()
, il appelle le DAO qui a été moqué et renvoie "John" pour le prénom et "Smith" pour le nom de famille, les assemble et tout est parfait. Pas besoin de tester réellement une base de données là-bas.
Les choses deviennent un peu plus lorsque la logique devient un peu plus complexe. Et si vous aviez une méthode "createOrUpdateUser (...)". Si vous vous êtes moqué de la base de données, vous pouvez vérifier qu'une méthode donnée a été appelée une fois avec un certain paramètre lorsque la maquette ne renvoie aucun objet et qu'une méthode différente est invoquée sur la base de données lorsqu'elle renvoie un objet existant. Cela commence à atteindre cette ligne floue où il pourrait être plus facile (surtout si elle était déjà là) de créer une base de données mémoire spécialisée et de tester ce code avec des données préconfigurées.
Dans un code réel sur lequel j'ai travaillé (point de vente), nous avions une resumeSuspededTransaction(...)
méthode. Cela tirerait la transaction de la base de données vers un objet (et ses composants) et mettrait à jour la base de données. Nous l'avions moqué et un bug se cachait quelque part dans le code avec la sérialisation et la désérialisation des données allant à la base de données (nous avons changé un type qui était sérialisé différemment dans la base de données).
La maquette ne nous a pas montré le bogue car elle retournait son chemin heureux - sérialiser la transaction, la stocker dans la maquette, la désérialiser à partir de la simulation, tester qu'elles sont égales. Toutefois, lorsque vous sérialisez un objet avec un zéro non significatif dans la base de données, il les supprimait puis le recombinait en une chaîne sans les zéros. Nous avons détecté le bogue sans la base de données lors du dépannage (ce n'était pas si difficile à repérer une fois que nous savions qu'il était là).
Plus tard, nous avons mis une base de données là-dedans et nous avons réalisé que le bogue n'aurait jamais traversé ce test junit si nous allions à la place dans une base de données en mémoire.
Les bases de données en mémoire ont les avantages:
- ils peuvent être lancés rapidement (sans avoir besoin d'un DBA pour configurer des comptes, des tables et autres) pour les tests
- les données peuvent être préconfigurées pour ce test
- le test n'a pas besoin de s'inquiéter de faire reculer le test une fois terminé
- chaque test a sa propre base de données en mémoire, vous n'avez donc pas à vous inquiéter si deux tests s'exécutent simultanément
- ils peuvent être exécutés sur des systèmes qui ne sont pas connectés aux vraies bases de données