Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →