Completando Spring @Value durante la prueba unitaria

Resuelto Kyle asked hace 11 años • 13 respuestas

Estoy intentando escribir una prueba unitaria para un bean simple que se usa en mi programa para validar formularios. El bean está anotado @Componenty 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.

Kyle avatar Jun 28 '13 04:06 Kyle
Aceptado

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 @valuecampo, puede usar Springs ReflectionTestUtils; tiene un método setFieldpara configurar campos privados.

@ver JavaDoc: ReflectionTestUtils.setField(java.lang.Object, java.lang.String, java.lang.Object)

Ralph avatar Jun 28 '2013 00:06 Ralph

Desde Spring 4.1, puede configurar valores de propiedad solo en el código mediante el uso org.springframework.test.context.TestPropertySourcede 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.PropertySourcesPlaceholderConfigureren el contexto de Spring.

Edición 24-08-2017: si está utilizando SpringBoot 1.4.0 y versiones posteriores, puede inicializar las pruebas con @SpringBootTestanotaciones @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);
  }

}
Dmytro Boichenko avatar Jan 31 '2017 17:01 Dmytro Boichenko