2012-05-30 19 views
5

Tengo una aplicación principal-context.xml que define un marcador de posición propiedad con dos ubicaciones: Archivo de propiedades por defecto y un archivo de anulación opcional:establecer las propiedades del sistema o variables de entorno Antes de la propiedad de marcador de posición con SpringJunit4ClassRunner

<context:property-placeholder 
     location="classpath:config.properties,${configOverride}" 
     ignore-resource-not-found="true" /> 

El opcional la ubicación de anulación permite especificar otro archivo de propiedades (por ejemplo, "-DconfigOverride = file: /home/app/config.properties") con solo las propiedades que se deben anular.

Para mis pruebas de unidad, estoy usando un contexto de prueba que importa App-context.xml:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:test-context.xml"}) 
public class UserServiceTest { 
    ... 
} 

¿Cómo puedo configurar las propiedades del sistema o variables de entorno dentro de la aplicación antes de que el contexto de aplicación se carga? Me gustaría lograr el mismo efecto que establecer "-DconfigOverride = classpath: testConfig.properties" en todas las clases de prueba sin tener que especificar una línea de comando arg, si es posible.

Respuesta

5

Pensando,

  1. Extendiendo SpringJUnit4ClassRunner y establecer el sistema de propiedad configOverride en su constructor bloque/inicialización
  2. Luego pasa ExtendedSpringJUnit4ClassRunner a @RunWith
+0

Gracias por la sugerencia +1 - Pensé lo mismo, pero quería comprobar si había algo que pueda hacer en el contexto de la aplicación antes de ir y modificar todas las clases de prueba. Anulo algunos beans en el contexto de prueba, pero desafortunadamente, dado que se permiten múltiples marcadores de posición de propiedad, no puedo anular el marcador de posición de propiedad. – andy

3

Esto es lo que terminé haciendo - I no tuvo que cambiar ninguna clase de prueba de unidad. Desafortunadamente, no configuré la propiedad "configOverride" (ver la respuesta de AhamedMustafaM para una forma de hacerlo) y en su lugar reemplacé la definición de marcador de posición de la propiedad original (lo intenté nuevamente después de mis intentos fallidos iniciales y lo puse a funcionar).

que añade la siguiente línea a mi testContext.xml:

<!-- import the main app context --> 
<import resource="classpath:appContext.xml" /> 

<!-- this is the line i added --> 
<context:property-placeholder order="-999" 
     location="classpath:testConfig.properties" 
     ignore-unresolvable="true" /> 

Nota del orden = "- 999" atributo, que se utiliza para asegurar la prioridad sobre la definición de la propiedad-marcador de posición inicial (s). También configuro "ignorar-irresoluble" a "verdadero" para delegar cualquier propiedad no resuelta al configurador de marcador de posición original.

+0

esto es perfecto. funciona bien para mi –

15

Otra alternativa es establecer la propiedad del entorno en un método anotado @BeforeClass, que se invocará antes de que ocurra la Configuración del contexto.

@BeforeClass 
public static void setSystemProps() { 
    System.setProperty("configOverride", "yourVal"); 
} 
+1

Y tal vez un 'System.clearProperty (" configOverride ")' en un '@ AfterClass' – vegemite4me

+0

Disculpe la demora en la respuesta. Esto definitivamente funcionaría también. Esperaba mantener la única cadena codificada en la clase de prueba como el camino del contexto de primavera, pero a veces no es posible. – andy

0

Mi problema fue similar pero quería establecer la variable de entorno spring.profiles.active y resultó que sólo tenía que tirar @ActiveProfiles() con los valores que quería a la prueba en sí.

Cuestiones relacionadas