Tengo una aplicación Spring-Boot donde las propiedades predeterminadas se establecen en un application.propertiesarchivo 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.propertiesarchivo (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.propertiesal 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.propertiesconfiguración en las pruebas JUnit con la test.propertiesque debo haber pasado por alto.
fuente

Respuestas:
Puede usar
@TestPropertySourcepara anular valores enapplication.properties. De su javadoc:Por ejemplo:
fuente
@TestPropertySourcepuede aceptar unpropertiesargumento 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"})@SpringApplicationConfigurationya está en desuso, y debe usar@SpringBootTestSpring Boot se carga automáticamente
src/test/resources/application.properties, si se utilizan las siguientes anotacionesPor lo tanto, cambie el nombre
test.propertiesaapplication.propertiespara 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.propertiesy luegoapplication-test.propertiespropiedades 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.propertiesarchivos en el classpath (uno adentrosrc/main/resourcesy uno adentrosrc/test/resources). ¿Quién garantiza que se tomarán ambos y cuál se tomará primero?application-test.propertiesensrc/main/resourcesy especificartestcomo el perfil activo en el caso de prueba.src/test/resources/application.propertiesse cargan durante la fase de prueba,src/main/resources/application.propertiesse ignora.application-default.propertiesy 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
@SpringBootTestanotación:fuente
SpringBootTestcarga el archivo application.properties?TLDR:
Entonces, lo que hice fue tener el estándar
src/main/resources/application.propertiesy también unsrc/test/resources/application-default.propertiesdonde 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>.propertiesanula 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.propertiesensrc/main/resourcesysrc/test/resources, y usted está preguntando por qué elapplication.propertiesen la carpeta de prueba no se preponderantes con elapplication.propertiesde sus principales recursos, sigue leyendo ...Si tiene
application.propertiesdebajosrc/main/resourcesy el mismoapplication.propertiesdebajosrc/test/resources, queapplication.propertiesse recoge, depende de cómo esté ejecutando sus pruebas . La carpeta de la estructurasrc/main/resourcesysrc/test/resources, es una convención de arquitectura Maven, por lo que si se ejecuta la prueba comomvnw testo inclusogradlew test, laapplication.propertiesdesrc/test/resourcesconseguirá recogido, como prueba de ruta de clase precederá principal ruta de clase. Sin embargo, si se ejecuta la prueba comoRun as JUnit Testen el Elipse / STS, laapplication.propertiesdesrc/main/resourcesconseguirá 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=testy luego tener un recurso class-path desrc/test/test.propertiesnuestra instancia nativaorg.springframework.boot.SpringApplicationse 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.propertiesno 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