Comment tester la prise en charge de la mise en cache déclarative de Spring sur les référentiels Spring Data?
J'ai développé un Printemps référentiel de Données, MemberRepository
de l'interface, qui s'étend org.springframework.data.jpa.repository.JpaRepository
. MemberRepository
a une méthode:
@Cacheable(CacheConfiguration.DATABASE_CACHE_NAME)
Member findByEmail(String email);
Le résultat est mis en cache par le Printemps cache abstraction (soutenu par un ConcurrentMapCache
).
Le problème que j'ai est que je veux écrire un test d'intégration (contre hsqldb), qui affirme que le résultat est extrait de db la première fois et de cache de la deuxième fois.
J'ai d'abord pensé à se moquer de la jpa de l'infrastructure (gestionnaire d'entités, etc.) et en quelque sorte affirmer que le gestionnaire d'entité n'est pas la deuxième fois, mais il semble trop dur/encombrant (voir https://stackoverflow.com/a/23442457/536299).
Quelqu'un peut-il alors s'il vous plaît fournir des conseils sur la manière de tester le comportement de mise en cache d'un Ressort Référentiel de Données méthode annotée avec @Cacheable
?
source d'informationauteur balteo
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez tester un aspect technique comme la mise en cache, ne pas utiliser une base de données à tous. Il est important de comprendre ce que vous souhaitez tester ici. Vous voulez vous assurer que, l'invocation de la méthode est à éviter pour l'invocation avec les mêmes arguments. Le référentiel face à une base de données est complètement orthogonale à l'aspect de ce sujet.
Voici ce que je recommande:
Échantillon
Comme vous pouvez le voir, nous faire un peu plus de tests ici:
Points clés à retenir
J'ai essayé de tester le comportement du cache dans mon application à l'aide d'Oliver exemple. Dans mon cas, mon cache est fixé à la couche de service et je veux vérifier que mon repo est appelé le bon nombre de fois. Je suis l'aide de spock se moque plutôt de mockito. J'ai passé un certain temps à essayer de comprendre pourquoi mes tests sont en échec, jusqu'à ce que j'ai réalisé que les tests de lancement de la première peuplent le cache et de l'apport d'autres tests. Après l'effacement du cache de chaque test, ils ont commencé à se comporter comme prévu.
Voici ce que j'ai: