Spring Boot nous permet de remplacer nos fichiers application.properties par des équivalents YAML. Cependant, je semble avoir un problème avec mes tests. Si j'annote monTestConfiguration
(une simple configuration Java), il attend un fichier de propriétés.
Par exemple, cela ne fonctionne pas:
@PropertySource(value = "classpath:application-test.yml")
Si je l'ai dans mon fichier YAML:
db:
url: jdbc:oracle:thin:@pathToMyDb
username: someUser
password: fakePassword
Et je tirerais parti de ces valeurs avec quelque chose comme ceci:
@Value("${db.username}") String username
Cependant, je me retrouve avec une erreur comme ceci:
Could not resolve placeholder 'db.username' in string value "${db.username}"
Comment puis-je tirer parti de la qualité YAML dans mes tests?
spring
spring-boot
checketts
la source
la source
Réponses:
Spring-boot a une aide pour cela, il suffit d'ajouter
en haut de vos classes de test ou une superclasse de test abstraite.
Edit: j'ai écrit cette réponse il y a cinq ans. Cela ne fonctionne pas avec les versions récentes de Spring Boot. C'est ce que je fais maintenant (veuillez traduire le Kotlin en Java si nécessaire):
est ajouté en haut, puis
au contexte.
la source
@SpringJUnitConfig(value = {...}, initializers = {ConfigFileApplicationContextInitializer.class})
Comme il a été mentionné,
@PropertySource
ne charge pas le fichier yaml. Pour contourner le problème, chargez le fichier vous-même et ajoutez les propriétés chargées àEnvironment
.Implémentation
ApplicationContextInitializer
:Ajoutez votre initialiseur à votre test:
la source
YamlFileApplicationContextInitializer
classe où l'emplacement YAML est défini par cas de test. Si vous pensez que c'est intéressant, n'hésitez pas à le fusionner dans votre réponse et je supprimerai la mienne. Faites-moi savoir dans un commentaire ci-dessous ma réponse.@PropertySource
peut être configuré parfactory
argument. Vous pouvez donc faire quelque chose comme:Où se
YamlPropertyLoaderFactory
trouve votre chargeur de propriétés personnalisé:Inspiré par https://stackoverflow.com/a/45882447/4527110
la source
IllegalStateException
lorsque le fichier n'existe pas au lieu du fichier appropriéFileNotFoundException
- donc pour que cela fonctionne avec@PropertySource(..., ignoreResourceNotFound = true)
, vous aurez besoin de rattraper et gérer ce cas:try { return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource(), null); } catch (IllegalStateException e) { throw (IOException) e.getCause(); }
CompositePropertySource propertySource = new CompositePropertySource(name); new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()).stream().forEach(propertySource::addPropertySource); return propertySource;
@PropertySource
ne prend en charge que les fichiers de propriétés (c'est une limitation de Spring, pas de Boot lui-même). N'hésitez pas à ouvrir un ticket de demande de fonctionnalité dans JIRA .la source
ApplicationContextInitializer
et l'ajouter à la configuration de test (utilisez simplement unYamlPropertySourceLoader
pour améliorer leEnvironment
). Personnellement, je préférerais qu'il@PropertySource
supporte ce comportement de manière native.Une autre option consiste à définir le
spring.config.location
via@TestPropertySource
:la source
@TestPropertySource(properties = {"spring.config.location=classpath:application-${test.env}.yml" })
IMO vôtre est la meilleure réponse de toutes.@TestPropertySource(properties = {"spring.config.location=classpath:application-config.yml,classpath:test-config.yml,..." })
@SpringBootTest
annotationDepuis Spring Boot 1.4, vous pouvez utiliser le nouveau
@SpringBootTest
annotation pour y parvenir plus facilement (et pour simplifier votre configuration de test d'intégration en général) en amorçant vos tests d'intégration à l'aide de la prise en charge de Spring Boot.Détails sur le blog du printemps .
Pour autant que je sache, cela signifie que vous bénéficiez de tous les avantages de la qualité de configuration externalisée de Spring Boot, tout comme dans votre code de production, y compris la récupération automatique de la configuration YAML à partir du chemin de classe.
Par défaut, cette annotation
mais vous pouvez spécifier d'autres classes de configuration si nécessaire.
Dans ce cas particulier, vous pouvez combiner
@SpringBootTest
avec@ActiveProfiles( "test" )
et Spring récupérera votre configuration YAML, à condition qu'elle suive les normes de dénomination Boot normales (ieapplication-test.yml
).Remarque:
SpringRunner.class
est le nouveau nom deSpringJUnit4ClassRunner.class
la source
L'approche du chargement des propriétés yaml, à mon humble avis, peut se faire de deux manières:
une. Vous pouvez placer la configuration dans un emplacement standard -
application.yml
dans la racinesrc/main/resources
du chemin de classe - généralement et cette propriété yaml devrait être automatiquement chargée par Spring boot avec le nom de chemin aplati que vous avez mentionné.b. La deuxième approche est un peu plus étendue, définissez essentiellement une classe pour contenir vos propriétés de cette façon:
Donc, essentiellement, cela signifie que charger le fichier yaml et remplir la classe DbProperties en fonction de l'élément racine de "db".
Maintenant, pour l'utiliser dans n'importe quelle classe, vous devrez faire ceci:
Chacune de ces approches devrait fonctionner pour vous proprement en utilisant Spring-boot.
la source
snakeyaml
est tirée comme une dépendance transitive parspring-boot-starter
, il ne devrait donc pas être nécessaire de l'ajouter à votrepom.xml
oubuild.gradle
, à moins que vous ayez une envie profonde d'utiliser une version différente. :)locations
, nonpath
, et leConfigFileApplicationContextInitializer
est également nécessaire.J'ai trouvé une solution de contournement en utilisant
@ActiveProfiles("test")
et en ajoutant un fichier application-test.yml à src / test / resources.Cela a fini par ressembler à ceci:
Le fichier application-test.yml contient juste les propriétés que je souhaite remplacer depuis application.yml (qui se trouvent dans src / main / resources).
la source
@Value("${my.property}")
mais cela fonctionne bien si j'utiliseenvironment.getProperty("my.property")
.c'est parce que vous n'avez pas configuré snakeyml. Spring Boot est livré avec la fonction @EnableAutoConfiguration. il y a aussi une configuration snakeyml lorsque vous appelez cette annotation ..
c'est mon chemin:
voici mon test:
la source
J'avais besoin de lire certaines propriétés dans mon code et cela fonctionne avec spring-boot 1.3.0.
la source
Chargement d'un fichier yml personnalisé avec une configuration de profil multiple dans Spring Boot.
1) Ajoutez le bean de propriété au démarrage de SpringBootApplication comme suit
2) Configurez l'objet Java pojo comme suit
3) Créez le yml personnalisé (et placez-le sous le chemin de la ressource comme suit, Nom du fichier YML: test-service-config.yml
Par exemple, Config dans le fichier yml.
la source
J'étais dans une situation particulière où je ne pouvais pas charger une classe @ConfigurationProperties en raison de la dénomination de propriété de fichier personnalisée. À la fin, la seule chose qui a fonctionné est (merci @Mateusz Balbus):
la source
Bienvenue à utiliser ma bibliothèque. Maintenant yaml , toml , hocon est pris en charge.
Source: github.com
la source
Ce n'est pas une réponse à la question d'origine, mais une solution alternative pour un besoin d'avoir une configuration différente dans un test ...
Au lieu de
@PropertySource
vous pouvez utiliser-Dspring.config.additional-location=classpath:application-tests.yml
.Attention, ce suffixe
tests
ne signifie pas profil ...Dans ce fichier YAML, on peut spécifier plusieurs profils, qui peuvent en quelque sorte hériter les uns des autres, en savoir plus ici - Résolution de propriétés pour plusieurs profils Spring (configuration yaml)
Ensuite, vous pouvez spécifier dans votre test, que les profils actifs (utilisant
@ActiveProfiles("profile1,profile2")
) sont ceuxprofile1,profile2
oùprofile2
remplaceront simplement (certains, il n'est pas nécessaire de remplacer toutes) les propriétésprofile1
.la source
J'ai essayé toutes les questions énumérées, mais elles ne fonctionnent pas toutes pour ma tâche: utiliser un fichier yaml spécifique pour un test unitaire. Dans mon cas, cela fonctionne comme ceci:
la source
Il n'est pas nécessaire d'ajouter comme YamlPropertyLoaderFactory ou YamlFileApplicationContextInitializer. Vous devez convertir votre idée. tout comme le projet de printemps commun. Vous savez, n'utilisez pas la configuration Java. Juste * .xml
Suivez ces étapes:
Ajoutez simplement applicationContext.xml comme
puis ajouter
à ton
ApplicationMainClass
.Cela peut aider à analyser votre application-test.yml
la source