Completando Spring @Value durante la prueba unitaria
Estoy intentando escribir una prueba unitaria para un bean simple que se usa en mi programa para validar formularios. El bean está anotado @Component
y tiene una variable de clase que se inicializa usando
@Value("${this.property.value}") private String thisProperty;
Me gustaría escribir pruebas unitarias para los métodos de validación dentro de esta clase; sin embargo, si es posible, me gustaría hacerlo sin utilizar el archivo de propiedades. Mi razonamiento detrás de esto es que si el valor que estoy extrayendo del archivo de propiedades cambia, me gustaría que eso no afecte mi caso de prueba. Mi caso de prueba es probar el código que valida el valor, no el valor en sí.
¿Hay alguna manera de usar código Java dentro de mi clase de prueba para inicializar una clase Java y completar la propiedad Spring @Value dentro de esa clase y luego usarla para realizar pruebas?
Encontré este procedimiento que parece estar cerca, pero aún usa un archivo de propiedades. Preferiría que todo fuera código Java.
Si es posible, intentaría escribir esas pruebas sin Spring Context. Si crea esta clase en su prueba sin Spring, entonces tendrá control total sobre sus campos.
Para configurar el @value
campo, puede usar Springs ReflectionTestUtils
; tiene un método setField
para configurar campos privados.
@ver JavaDoc: ReflectionTestUtils.setField(java.lang.Object, java.lang.String, java.lang.Object)
Desde Spring 4.1, puede configurar valores de propiedad solo en el código mediante el uso org.springframework.test.context.TestPropertySource
de anotaciones en el nivel de clase de Pruebas unitarias. Podría utilizar este enfoque incluso para inyectar propiedades en instancias de beans dependientes.
Por ejemplo
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
"some.bar.value=testValue",
})
public class FooTest {
@Value("${some.bar.value}")
String bar;
@Test
public void testValueSetup() {
assertEquals("testValue", bar);
}
@Configuration
static class Config {
@Bean
public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
return new PropertySourcesPlaceholderConfigurer();
}
}
}
Nota: Es necesario tener una instancia org.springframework.context.support.PropertySourcesPlaceholderConfigurer
en el contexto de Spring.
Edición 24-08-2017: si está utilizando SpringBoot 1.4.0 y versiones posteriores, puede inicializar las pruebas con @SpringBootTest
anotaciones @SpringBootConfiguration
. Más información aquí
En el caso de SpringBoot tenemos el siguiente código
@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
"some.bar.value=testValue",
})
public class FooTest {
@Value("${some.bar.value}")
String bar;
@Test
public void testValueSetup() {
assertEquals("testValue", bar);
}
}