1
votes

@WebMvcTest ne trouve pas buildProperties

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 ?


0 commentaires

3 Réponses :


0
votes

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)


1 commentaires

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.



1
votes

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.


0 commentaires

0
votes

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é .


0 commentaires