2012-07-03 24 views
52

Me gustaría escribir algunas pruebas que comprueben la configuración de XML Spring de un WAR desplegado. Desafortunadamente, algunos beans requieren que se establezcan algunas variables de entorno o propiedades del sistema. ¿Cómo puedo establecer una variable de entorno antes de que los beans de primavera se inicialicen al usar el estilo de prueba conveniente con @ContextConfiguration?¿Cómo establecer la variable de entorno o la propiedad del sistema en las pruebas de primavera?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
public class TestWarSpringContext { ... } 

Si puedo configurar el contexto de aplicación con anotaciones, no veo un gancho en el que puedo hacer algo antes de que se inicializa el contexto de la primavera.

Respuesta

75

puede inicializar la propiedad del sistema en un inicializador estático:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
public class TestWarSpringContext { 

    static { 
     System.setProperty("myproperty", "foo"); 
    } 

} 

El código inicializador estático se ejecutará antes de que se inicializa el contexto de aplicación de primavera.

+8

Silly me - OK, eso funcionaría. Aún mejor: probablemente un método '@ BeforeClass' para establecer la propiedad del sistema y un método' @ AfterClass' para eliminarlo también funcionaría, y limpiaría bien después de sí mismo. (No lo probé, sin embargo). –

+1

Intenté @BeforeClass - y funcionó bien para configurar las propiedades del sistema antes de que se establecieran otras propiedades en la instancia de prueba – wbdarby

+0

Gracias por esto. ¡Lo estático no funcionó pero funcionó un pequeño método con @BeforeClass! –

45

La forma correcta de hacerlo, comenzando con Spring 4.1, es utilizar una anotación @TestPropertySource.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
@TestPropertySource(properties = {"myproperty = foo"}) 
public class TestWarSpringContext { 
    ...  
} 

Ver @TestPropertySource en el Spring docs y Javadocs.

+1

Esta anotación también admite una ruta de archivo de propiedades. – MigDus

+2

Pude cambiar la etiqueta de Spring Cloud Config Client durante las pruebas usando '@TestPropertySource (properties = {" spring.cloud.config.label = feature/branch "})' –

+0

Buena respuesta, pero lamentablemente no funcionó para mí, usando Primavera 4.2.9, la propiedad siempre estaba vacía. Solo el bloque estático funcionó ... Funcionó para las propiedades de la aplicación, pero no para las propiedades del sistema. – Gregor

4

También se puede utilizar un ApplicationContextInitializer prueba para inicializar una propiedad del sistema:

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
{ 
    @Override 
    public void initialize(ConfigurableApplicationContext applicationContext) 
    { 
     System.setProperty("myproperty", "value"); 
    } 
} 

y luego configurarlo en la clase de prueba, además de las ubicaciones de los archivos de Primavera contexto de configuración:

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SomeTest 
{ 
... 
} 

Este la duplicación de código de manera se puede evitar si se debe establecer una determinada propiedad del sistema para todas las pruebas unitarias.

0

Si desea que sus variables que sean válidas para todas las pruebas, puede tener un archivo application.properties en el directorio de recursos de prueba (por defecto: src/test/resources) que se verá algo como esto:

MYPROPERTY=foo 

Este será entonces cargue y use a menos que tenga definiciones a través del @TestPropertySource o un método similar - el orden exacto en que se cargan las propiedades se puede encontrar en el capítulo de documentación de Spring 24. Externalized Configuration.

Cuestiones relacionadas