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 ]
-
Agregue
src/main/resources/application-test.properties
. -
@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 { }