Lors de l'écriture de tests, pourquoi quelqu'un voudrait-il utiliser une base de données en mémoire plutôt que de se moquer des données?
Je pouvais voir que les bases de données en mémoire pouvaient être utiles pour tester ses référentiels. Mais si vous utilisez un framework (comme Spring Data), tester les référentiels serait tester le framework et pas vraiment la logique de l'application.
La simulation, cependant, semble plus rapide et suit le même schéma que celui généralement utilisé lors de l'écriture de tests unitaires et de TDD.
Alors qu'est-ce qui me manque? Quand / pourquoi une base de données en mémoire serait-elle avantageuse?
La plupart du temps, les tests de base de données en mémoire sont plus simples que les simulations. C'est aussi beaucoup plus flexible. Et il vérifie également que les fichiers de migration sont bien exécutés (lorsqu'il y a des fichiers de migration).
Voir ce pseudo code:
Le
InMemoryTest
ne dépend pas de la façon dontDatabase
est mis en œuvreUserRepository
pour fonctionner. Il utilise simplement l'UserRepository
interface publique (create
) puis l'affirme. Ce test ne se cassera pas si vous modifiez l'implémentation mais il est plus lent.Pendant ce temps, le
MockingDBTest
repose entièrement sur la façon dont ilDatabase
est mis en œuvreUserRepository
. En fait, si vous modifiez l'implémentation tout en la faisant fonctionner d'une autre manière, ce test échouerait.Le meilleur des deux mondes serait d'utiliser un faux implémentant l'
Database
interface:C'est beaucoup plus expressif, plus facile à lire et à comprendre, et cela ne dépend pas de l'implémentation de la base de données réelle effectuée dans les couches supérieures du code.
la source