Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 7 · Application directe du cours
Le graphe en une requête
Tester l'application · niveau 3 (difficile)
Énoncé
Écrire un test qui garantit que la liste des commandes de l'administration, convertie en CommandeVue, ne coûte qu'une requête SQL, quel que soit le nombre de commandes. À quoi servira ce test le jour où quelqu'un supprimera l'annotation @EntityGraph ?
Corrigé
void ex9_leGrapheNeCouteQuUneRequete() {
for (String isbn : new String[] {"9782956300052", "9782956300069"}) {
Commande c = new Commande("Ada", "ada@example.org", Retrait.BOUTIQUE);
c.ajouterLigne(new LigneCommande(livres.findById(isbn).orElseThrow(), 1));
commandes.save(c);
}
em.flush();
em.clear();
Statistics stats = emf.unwrap(SessionFactory.class).getStatistics();
stats.clear();
var vues = commandes.findAllByOrderByNumeroAsc().stream().map(CommandeVue::de).toList();
assertThat(vues).hasSize(2);
assertThat(stats.getPrepareStatementCount()).isEqualTo(1);
}
avec, sur la classe de test :
@DataJpaTest(properties = "spring.jpa.properties.hibernate.generate_statistics=true")
Le flush et le clear sont indispensables : sans eux, les commandes seraient encore dans le contexte de persistance, la conversion ne demanderait rien à la base, et le test passerait même sans graphe. Ce test protège une performance : si quelqu'un supprime l'annotation, il échouera (une requête pour les commandes, puis une par commande et par livre), alors qu'aucun test fonctionnel ne verrait la différence.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.