Tengo una aplicación Spring-Boot donde las propiedades predeterminadas se establecen en un application.properties
archivo en el classpath (src / main / resources / application.properties).
Me gustaría anular algunas configuraciones predeterminadas en mi prueba JUnit con propiedades declaradas en un test.properties
archivo (src / test / resources / test.properties)
Normalmente tengo una clase de configuración dedicada para mis pruebas Junit, por ejemplo
package foo.bar.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
}
Primero pensé que usar @PropertySource("classpath:test.properties")
en la clase TestConfig haría el truco, pero estas propiedades no sobrescribirán la configuración de application.properties (ver Spring-Boot Reference Doc - 23. Configuración externalizada ).
Luego traté de usar -Dspring.config.location=classpath:test.properties
al invocar la prueba. Eso fue exitoso, pero no quiero establecer esta propiedad del sistema para cada ejecución de prueba. Así lo puse en el código
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
que desafortunadamente nuevamente no tuvo éxito.
Debe haber una solución simple sobre cómo anular la application.properties
configuración en las pruebas JUnit con la test.properties
que debo haber pasado por alto.
fuente
Respuestas:
Puede usar
@TestPropertySource
para anular valores enapplication.properties
. De su javadoc:Por ejemplo:
fuente
@TestPropertySource
puede aceptar unproperties
argumento para sobrescribir alguna propiedad en línea, por ejemplo@TestPropertySource(properties = "myConf.myProp=valueInTest")
, es útil en caso de que no desee un archivo de propiedad totalmente nuevo.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
ya está en desuso, y debe usar@SpringBootTest
Spring Boot se carga automáticamente
src/test/resources/application.properties
, si se utilizan las siguientes anotacionesPor lo tanto, cambie el nombre
test.properties
aapplication.properties
para utilizar la configuración automática.[ Actualización: anulación de ciertas propiedades para la prueba ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Esto carga
application.properties
y luegoapplication-test.properties
propiedades en el contexto de la aplicación para el caso de prueba, según las reglas definidas aquí .Demostración: https://github.com/mohnish82/so-spring-boot-testprops
fuente
application.properties
archivos en el classpath (uno adentrosrc/main/resources
y uno adentrosrc/test/resources
). ¿Quién garantiza que se tomarán ambos y cuál se tomará primero?application-test.properties
ensrc/main/resources
y especificartest
como el perfil activo en el caso de prueba.src/test/resources/application.properties
se cargan durante la fase de prueba,src/main/resources/application.properties
se ignora.application-default.properties
y se considerarán porque está ejecutando automáticamente el perfil "predeterminado" (si no se declara otro).También puede usar metaanotaciones para externalizar la configuración. Por ejemplo:
fuente
Otro enfoque adecuado para anular algunas propiedades en su prueba, si está utilizando una
@SpringBootTest
anotación:fuente
SpringBootTest
carga el archivo application.properties?TLDR:
Entonces, lo que hice fue tener el estándar
src/main/resources/application.properties
y también unsrc/test/resources/application-default.properties
donde anulo algunas configuraciones para TODAS mis pruebas.Toda la historia
Me encontré con el mismo problema y hasta ahora no estaba usando perfiles. Parecía molesto tener que hacerlo ahora y recordar haber declarado el perfil, lo cual se puede olvidar fácilmente.
El truco consiste en aprovechar que un perfil específico
application-<profile>.properties
anula la configuración en el perfil general. Ver https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .fuente
Explicación simple:
Si usted es como yo y que tienen el mismo
application.properties
ensrc/main/resources
ysrc/test/resources
, y usted está preguntando por qué elapplication.properties
en la carpeta de prueba no se preponderantes con elapplication.properties
de sus principales recursos, sigue leyendo ...Si tiene
application.properties
debajosrc/main/resources
y el mismoapplication.properties
debajosrc/test/resources
, queapplication.properties
se recoge, depende de cómo esté ejecutando sus pruebas . La carpeta de la estructurasrc/main/resources
ysrc/test/resources
, es una convención de arquitectura Maven, por lo que si se ejecuta la prueba comomvnw test
o inclusogradlew test
, laapplication.properties
desrc/test/resources
conseguirá recogido, como prueba de ruta de clase precederá principal ruta de clase. Sin embargo, si se ejecuta la prueba comoRun as JUnit Test
en el Elipse / STS, laapplication.properties
desrc/main/resources
conseguirá recogido, como principales precede classpath prueba de ruta de clases.Puedes verlo abriendo el
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Verás algo como:
¿Ves que \ main viene primero, y luego \ test ? Bien, se trata de classpath :-)
Salud
fuente
fuente
Si está utilizando Spring 5.2.5 y Spring Boot 2.2.6 y desea anular solo algunas propiedades en lugar de todo el archivo. Puede usar la nueva anotación: @DynamicPropertySource
fuente
De lo contrario, podemos cambiar el nombre del configurador de propiedades predeterminado, establecer la propiedad
spring.config.name=test
y luego tener un recurso class-path desrc/test/test.properties
nuestra instancia nativaorg.springframework.boot.SpringApplication
se configurará automáticamente a partir de este test.properties separado, ignorando las propiedades de la aplicación;Ventaja: autoconfiguración de pruebas;
Inconveniente: exponer la propiedad "spring.config.name" en la capa CI
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
fuente
application.properties
no es una opción para mí, ya que solo quiero anular algunos de los valores de configuración originales en la prueba.También puede crear un archivo application.properties en src / test / resources donde se escriben sus JUnits.
fuente