test starter start example datajpatest application java unit-testing spring-boot

java - starter - Anular la configuración predeterminada de la aplicación Spring-Boot.properties en Junit Test



spring-boot-starter-test (7)

TLDR:

Entonces, lo que hice fue tener el src/main/resources/application.properties estándar y también un src/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 una application-<profile>.properties específica de 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 .

Tengo una aplicación Spring-Boot donde las propiedades predeterminadas se establecen en un archivo application.properties en classpath (src / main / resources / application.properties).

Me gustaría anular algunas configuraciones predeterminadas en mi prueba JUnit con propiedades declaradas en un archivo test.properties (src / test / resources / test.properties)

Por lo general, 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 intenté 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 configuración de application.properties en las pruebas JUnit con test.properties que debo haber pasado por alto.


De lo contrario, podemos cambiar el nombre del configurador de propiedades predeterminado, establecer la propiedad spring.config.name=test y luego tener el recurso de ruta de clase src/test/test.properties nuestra instancia nativa de org.springframework.boot.SpringApplication se configurará automáticamente de esta propiedad de prueba separada, 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

spring.config.name = aplicación # Nombre del archivo de configuración


Otro enfoque adecuado para anular algunas propiedades en su prueba, si está utilizando la anotación @SpringBootTest :

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})


Puede usar @TestPropertySource para anular valores en application.properties . De su javadoc:

Las fuentes de propiedades de prueba se pueden usar para anular selectivamente las propiedades definidas en las fuentes de propiedades del sistema y de la aplicación

Por ejemplo:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = ExampleApplication.class) @TestPropertySource(locations="classpath:test.properties") public class ExampleApplicationTests { }


Spring Boot carga automáticamente src/test/resources/application.properties , si se utilizan las siguientes anotaciones

@RunWith(SpringRunner.class) @SpringBootTest

Por lo tanto, cambie el nombre de test.properties a application.properties para utilizar la configuración automática.

Si * solo * necesita cargar el archivo de propiedades (en el Entorno) también puede usar lo siguiente, como se explica here

@RunWith(SpringRunner.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)

[ Actualización: anulación de ciertas propiedades para la prueba ]

  1. Agregue src/main/resources/application-test.properties .
  2. @ActiveProfiles("test") clase de prueba con @ActiveProfiles("test") .

Esto carga las propiedades application.properties y luego application-test.properties en el contexto de la aplicación para el caso de prueba, según las reglas definidas here .

Demostración: https://github.com/mohnish82/so-spring-boot-testprops


También puede crear un archivo application.properties en src / test / resources donde se escriben sus JUnits.


También puede usar meta-annotations para externalizar la configuración. Por ejemplo:

@RunWith(SpringJUnit4ClassRunner.class) @DefaultTestAnnotations public class ExampleApplicationTests { ... } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @SpringApplicationConfiguration(classes = ExampleApplication.class) @TestPropertySource(locations="classpath:test.properties") public @interface DefaultTestAnnotations { }