J'ai des tests JUnit fonctionnels pour mes contrôleurs MVC. Maintenant, je voulais afficher le numéro de build dans le pied de page de chaque page, j'ai donc ajouté le div suivant dans mes modèles thymeleaf:
@MockBean private BuildProperties buildProperties;
Maintenant, le test échoue avec:
Causé par: org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean nommé 'buildProperties' disponible
J'ai essayé de l'ajouter comme un simulacre en vain:
<div class="versionInfo">Version <span th:text="${@buildProperties.getVersion()}"></span></div>
Ou en suivant ce conseil (voir mon commentaire ci-dessous la réponse).
Alors, comment puis-je faire fonctionner mes tests à nouveau avec BuildProperties
?
3 Réponses :
Si vous utilisez gradle, ajoutez simplement ceci à votre fichier build.grandle:
SpringBoot { buildInfo() }
Après avoir configuré le plugin spring-boot-maven-plugin, vous pouvez créer l'application et accéder aux informations sur la construction de l'application. L'objet BuildProperties est injecté par Spring (@Autowired)
Merci, mais la logique de base fonctionne si j'appelle la page dans un navigateur, mais mon problème vient du test JUnit de mes tests MVC.
Lorsque vous essayez d'accéder à un bean de la manière suivante: ${@buildProperties.getVersion()}
c'est en fait une expression SpEL pour accéder à un bean via un BeanReference. Malheureusement, il n'a pas de valeur par défaut et au lieu de renvoyer null
il lève une exception si le bean est introuvable.
Je ne connais pas de moyen simple de vérifier si un bean existe dans le contexte via SpEL.
Je pense donc que la meilleure solution si vous créez une classe de configuration de test imbriquée et définissez un bean BuildProperties par défaut.
@TestConfiguration public static class TestConfig { @Bean BuildProperties buildProperties() { return new BuildProperties(new Properties()); } }
Ou vous pouvez le créer en tant que classe distincte et utiliser @Import (TestConfig.class) si vous avez besoin de cette configuration supplémentaire dans plusieurs classes de test.
Changer le @WebMvcTest en un @SpringBootTest complet résoudrait le problème, car alors le ProjectInfoAutoConfiguration serait exécuté. Comme je voulais m'en tenir à @WebMvcTest, j'ai inclus le ProjectInfoAutoConfiguration à mon WebMvcTest:
@WebMvcTest(YOUR_CONTROLLER_HERE.class) @ImportAutoConfiguration(ProjectInfoAutoConfiguration.class) class YOUR_CONTROLLER_HERETest{ // Use at your will @Autowired private BuildProperties buildProperties; }
Bien sûr, cela ne fonctionnera que si le plugin Spring Boot Maven est correctement configuré .