Spring Boot nos permite reemplazar nuestros archivos application.properties con equivalentes YAML. Sin embargo, parece que tengo un problema con mis pruebas. Si anoto mi TestConfiguration
(una configuración simple de Java), se espera un archivo de propiedades.
Por ejemplo, esto no funciona:
@PropertySource(value = "classpath:application-test.yml")
Si tengo esto en mi archivo YAML:
db:
url: jdbc:oracle:thin:@pathToMyDb
username: someUser
password: fakePassword
Y estaría aprovechando esos valores con algo como esto:
@Value("${db.username}") String username
Sin embargo, termino con un error así:
Could not resolve placeholder 'db.username' in string value "${db.username}"
¿Cómo puedo aprovechar la bondad de YAML en mis pruebas también?
spring
spring-boot
chequeos
fuente
fuente
Respuestas:
Spring-boot tiene un ayudante para esto, solo agregue
en la parte superior de sus clases de prueba o en una superclase de prueba abstracta.
Editar: escribí esta respuesta hace cinco años. No funciona con versiones recientes de Spring Boot. Esto es lo que hago ahora (traduzca Kotlin a Java si es necesario):
se agrega a la parte superior, luego
al contexto.
fuente
@SpringJUnitConfig(value = {...}, initializers = {ConfigFileApplicationContextInitializer.class})
Como se mencionó
@PropertySource
, no carga el archivo yaml. Como solución, cargue el archivo por su cuenta y agregue las propiedades cargadas aEnvironment
.Implementar
ApplicationContextInitializer
:Agregue su inicializador a su prueba:
fuente
YamlFileApplicationContextInitializer
clase donde la ubicación de YAML se define por caso de prueba. Si cree que es interesante, no dude en fusionarlo con su respuesta y eliminaré la mía. Solo házmelo saber en un comentario debajo de mi respuesta.@PropertySource
se puede configurar porfactory
argumento. Entonces puedes hacer algo como:¿Dónde
YamlPropertyLoaderFactory
está su cargador de propiedades personalizadas?Inspirado en https://stackoverflow.com/a/45882447/4527110
fuente
IllegalStateException
cuando el archivo no existe en lugar del correctoFileNotFoundException
, por lo que para que esto funcione@PropertySource(..., ignoreResourceNotFound = true)
, necesitará detectar y manejar este caso: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
solo admite archivos de propiedades (es una limitación de Spring, no de Boot en sí). No dude en abrir un ticket de solicitud de función en JIRA .fuente
ApplicationContextInitializer
y agregarlo a la configuración de prueba (solo usa unYamlPropertySourceLoader
para mejorar elEnvironment
). Personalmente, preferiría que@PropertySource
apoyara este comportamiento de forma nativa.Otra opción es configurar el
spring.config.location
paso@TestPropertySource
:fuente
@TestPropertySource(properties = {"spring.config.location=classpath:application-${test.env}.yml" })
tuya es la mejor respuesta de todas.@TestPropertySource(properties = {"spring.config.location=classpath:application-config.yml,classpath:test-config.yml,..." })
@SpringBootTest
anotaciónDesde Spring Boot 1.4, puede usar la nueva
@SpringBootTest
anotación para lograr esto más fácilmente (y para simplificar la configuración de la prueba de integración en general) iniciando sus pruebas de integración con el soporte de Spring Boot.Detalles en el blog de primavera .
Por lo que puedo decir, esto significa que obtiene todos los beneficios de la bondad de configuración externalizada de Spring Boot al igual que en su código de producción, incluida la recogida automática de la configuración YAML de la ruta de clase.
De forma predeterminada, esta anotación
pero puede especificar otras clases de configuración si es necesario.
Para este caso particular, puede combinar
@SpringBootTest
con@ActiveProfiles( "test" )
y Spring recogerá su configuración YAML, siempre que siga los estándares de nomenclatura de arranque normales (es decir,application-test.yml
).Nota:
SpringRunner.class
es el nuevo nombre deSpringJUnit4ClassRunner.class
fuente
El enfoque para cargar las propiedades de yaml, en mi humilde opinión, se puede hacer de dos maneras:
a. Puede colocar la configuración en una ubicación estándar,
application.yml
en la raíz de la ruta desrc/main/resources
clase, normalmente y esta propiedad yaml debería cargarse automáticamente mediante Spring boot con el nombre de ruta plano que ha mencionado.si. El segundo enfoque es un poco más extenso, básicamente define una clase para mantener tus propiedades de esta manera:
Básicamente, esto está diciendo que cargue el archivo yaml y complete la clase DbProperties basándose en el elemento raíz de "db".
Ahora, para usarlo en cualquier clase, tendrá que hacer esto:
Cualquiera de estos enfoques debería funcionar correctamente con Spring-boot.
fuente
snakeyaml
se incorpora como una dependencia transitiva porspring-boot-starter
, por lo que no debería ser necesario agregarlo a supom.xml
obuild.gradle
, a menos que tenga una profunda necesidad de usar una versión diferente. :)locations
, nopath
, yConfigFileApplicationContextInitializer
también es obligatorio.Encontré una solución al usar
@ActiveProfiles("test")
y agregar un archivo application-test.yml a src / test / resources.Terminó luciendo así:
El archivo application-test.yml solo contiene las propiedades que quiero anular de application.yml (que se pueden encontrar en src / main / resources).
fuente
@Value("${my.property}")
pero funciona bien si lo usoenvironment.getProperty("my.property")
.es porque no ha configurado snakeyml. Spring Boot viene con la función @EnableAutoConfiguration. También hay una configuración de snakeyml cuando llama a esta anotación.
Esta es mi manera:
aquí está mi prueba:
fuente
Necesitaba leer algunas propiedades en mi código y esto funciona con spring-boot 1.3.0.RELEASE
fuente
Cargando archivo yml personalizado con configuración de perfil múltiple en Spring Boot.
1) Agregue el bean de propiedad con SpringBootApplication iniciando de la siguiente manera
2) Configure el objeto pojo de Java de la siguiente manera
3) Cree el yml personalizado (y colóquelo en la ruta del recurso de la siguiente manera, Nombre de archivo YML: test-service-config.yml
Por ejemplo, Config en el archivo yml.
fuente
Estaba en una situación particular en la que no podía cargar una clase @ConfigurationProperties debido a la denominación de propiedades de archivo personalizado. Al final lo único que funcionó fue (gracias @Mateusz Balbus):
fuente
Bienvenido a usar mi biblioteca. Ahora se admite yaml , toml , hocon .
Fuente: github.com
fuente
Esta no es una respuesta a la pregunta original, sino una solución alternativa para la necesidad de tener una configuración diferente en una prueba ...
En lugar de
@PropertySource
puedes usar-Dspring.config.additional-location=classpath:application-tests.yml
.Tenga en cuenta que ese sufijo
tests
no significa perfil ...En ese archivo YAML se pueden especificar múltiples perfiles, que pueden heredarse entre sí, lea más aquí - Resolución de propiedades para múltiples perfiles de Spring (configuración yaml)
A continuación, se puede especificar en su prueba, que los perfiles activos (utilizando
@ActiveProfiles("profile1,profile2")
) sonprofile1,profile2
dondeprofile2
simplemente anulará (algunos, no se necesita para anular todos) de propiedadesprofile1
.fuente
Probé todas las preguntas enumeradas, pero todas no funcionan para mi tarea: usar un archivo yaml específico para alguna prueba unitaria. En mi caso, funciona así:
fuente
No es necesario agregar como YamlPropertyLoaderFactory o YamlFileApplicationContextInitializer. Deberías convertir tu idea. al igual que el proyecto de primavera común. Ya sabes, no usando la configuración de Java. Solo * .xml
Sigue estos pasos:
Simplemente agregue applicationContext.xml como
Luego añade
a tu
ApplicationMainClass
.Esto puede ayudar a escanear su aplicación-test.yml
fuente