yml example enableconfigurationproperties configurationproperties application annotation java properties spring-boot

java - example - spring configuration properties annotation



Cómo probar clases con @ConfigurationProperties y @Autowired (3)

Debe anotar su TestConfiguraion con @EnableConfigurationProperties siguiente manera:

@EnableConfigurationProperties public class TestConfiguration { @Bean @ConfigurationProperties(prefix = "test") public TestSettings settings (){ return new TestSettings(); } }

Además, solo necesita incluir TestConfiguration.class en @ContextConfiguration de su clase SettingsTest :

@TestPropertySource(locations = "/SettingsTest.properties") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = TestConfiguration.class) public class SettingsTest { ...

Quiero probar partes pequeñas de la aplicación que se basan en propiedades cargadas con @Autowired y @ConfigurationProperties. Estoy buscando una solución cargando solo las propiedades requeridas y no siempre el ApplicationContext completo. Aquí como ejemplo reducido:

@TestPropertySource(locations = "/SettingsTest.properties") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {TestSettings.class, TestConfiguration.class}) public class SettingsTest { @Autowired TestConfiguration config; @Test public void testConfig(){ Assert.assertEquals("TEST_PROPERTY", config.settings().getProperty()); } }

Clase de configuración:

public class TestConfiguration { @Bean @ConfigurationProperties(prefix = "test") public TestSettings settings (){ return new TestSettings(); } }

Clase de configuración:

public class TestSettings { private String property; public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } }

El archivo de propiedades en la carpeta de recursos contiene la entrada:

test.property=TEST_PROPERTY

En mi configuración actual, la configuración no es nula, pero no hay campos disponibles. La razón por la que los campos no son campos debería tener algo que ver con el hecho de que no estoy usando Springboot sino Spring. Entonces, ¿cuál sería la manera Springboot de hacer que esto funcione?

edición: la razón por la que quiero hacer esto es: tengo un analizador que analiza los archivos de texto, las expresiones regulares utilizadas se almacenan en un archivo de propiedades. Para probar esto, me gustaría cargar solo las propiedades necesarias para este analizador que se encuentran en el ejemplo sobre el TestSettings .

Mientras leía los comentarios, ya noté que esto ya no es una prueba de unidad. Sin embargo, usar la configuración completa de arranque de Spring para esta pequeña prueba me parece demasiado. Es por eso que pregunté si existe la posibilidad de cargar solo una clase con propiedades.


Un par de puntos:

  1. No necesita una clase "TestConfiguration" en su paquete principal, porque todo lo que hace es configurar el bean "TestSettings". Puede hacerlo simplemente anotando la clase TestSettings en sí.

  2. Normalmente, cargaría el contexto que necesita para la prueba utilizando la anotación @SpringApplicationConfiguration , pasando el nombre de su clase de aplicación. Sin embargo, usted dijo que no desea cargar todo el ApplicationContext (aunque no está claro por qué), por lo que necesita crear una clase de configuración especial para cargar solo las pruebas. A continuación, lo llamo "TestConfigurationNew" para evitar confusiones con la clase TestConfiguration que tenía originalmente.

  3. En el mundo de Spring Boot, todas las propiedades generalmente se guardan en el archivo "application.properties"; Pero es posible almacenarlos en otro lugar. A continuación, he especificado el archivo "SettingsTest.properties" que propuso. Tenga en cuenta que puede tener dos copias de este archivo, la de la carpeta principal / recursos y la de la carpeta de prueba / recursos para la prueba.

Cambie el código de la siguiente manera:

TestSettings.java (en el paquete principal)

@Configuration @ConfigurationProperties(prefix="test", locations = "classpath:SettingsTest.properties") public class TestSettings { private String property; public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } }

SettingsTest.java (en el paquete de prueba)

@TestPropertySource(locations="classpath:SettingsTest.properties") @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = TestConfigurationNew.class) public class SettingsTest { @Autowired TestSettings settings; @Test public void testConfig(){ Assert.assertEquals("TEST_PROPERTY", settings.getProperty()); } }

TestConfigurationNew.java (en el paquete de prueba):

@EnableAutoConfiguration @ComponentScan(basePackages = { "my.package.main" }) @Configuration public class TestConfigurationNew { }

Esto debería funcionar ahora como quisieras.


en realidad, simplemente puede agregar @EnableConfigurationProperties a su @SpringBootTest directamente.
p.ej:

@ActiveProfiles("test") @RunWith(SpringRunner.class) @SpringBootTest(classes = TestConfiguration.class) @EnableConfigurationProperties ...