2012-05-30 15 views
5

Ich habe eine Haupt-app-context.xml, das eine Eigenschaft Platzhalter mit zwei Standorten definiert: Standardeigenschaften-Datei und eine optionale Überschreibungsdatei:Set Systemeigenschaften oder Umgebungsvariablen Vor Property Platzhalter mit SpringJunit4ClassRunner

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

Die optionale override location ermöglicht die Angabe einer anderen Eigenschaftendatei (zB "-DconfigOverride = file: /home/app/config.properties") mit nur den Eigenschaften, die überschrieben werden sollen.

Für meine Unit-Tests, ich bin mit einem Test-Kontext, die app-context.xml importiert:

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

Wie kann ich Systemeigenschaften oder Umgebungsvariablen innerhalb der Anwendung vor dem Anwendungskontext gesetzt wird geladen? Ich möchte den gleichen Effekt erreichen, indem ich "-DconfigOverride = classpath: testConfig.properties" über alle Testklassen hinweg setze, ohne, wenn möglich, ein Befehlszeilenarg anzugeben.

Antwort

5

Denken an,

  1. Erweiterung SpringJUnit4ClassRunner und Einstellung der Systemeigenschaft configOverride in seinem Konstruktor/Initialisierungsbaustein
  2. Dann ExtendedSpringJUnit4ClassRunner-@RunWith vorbei
+0

Danke für den Vorschlag +1 - Ich dachte das gleiche, aber ich wollte überprüfen, ob ich etwas im Anwendungskontext tun konnte, bevor ich alle Testklassen ändere. Ich überschreibe einige Beans im Testkontext, aber da mehrere Eigenschaftsplatzhalter zulässig sind, kann ich den Eigenschaftsplatzhalter nicht überschreiben. – andy

3

Hier ist, was ich tun endete - I musste keine Unit-Test-Klassen ändern. Leider habe ich die Eigenschaft "configOverride" nicht gesetzt (siehe die Antwort von AhamedMustafaM) und stattdessen die ursprüngliche Eigenschaft der Platzhalterdefinition überschrieben (ich habe es nach meinen ersten fehlgeschlagenen Versuchen erneut versucht und es zum Laufen gebracht).

Ich habe die folgende Zeile in meinem 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" /> 

Beachten Sie die Bestellung = „- 999“ Attribut, der Vorrang vor der ursprünglichen Eigenschaft-Platzhalter Definition (en), um sicherzustellen, verwendet wird. Außerdem setze ich "ignore-unresolvable" auf "true", um nicht lösbare Eigenschaften an den ursprünglichen Platzhalterkonfigurator zu delegieren.

+0

das ist genau richtig. funktioniert gut für mich. –

15

Eine weitere Alternative ist das Festlegen der Umgebungseigenschaft in einer Annotated-Methode @BeforeClass, die vor der Kontextkonfiguration aufgerufen wird.

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

Und vielleicht eine 'System.clearProperty (" configOverride ")' in einem '@ AfterClass' – vegemite4me

+0

Sorry für die verzögerte Antwort. Das würde definitiv auch funktionieren. Ich hatte gehofft, die einzige hart codierte Zeichenfolge in der Testklasse als den Spring-Kontextpfad zu behalten, aber manchmal ist es nicht möglich. – andy

0

Mein Problem war ähnlich, aber ich wollte die spring.profiles.active Umgebungsvariable setzen und es stellte sich heraus, dass ich nur @ActiveProfiles() mit den Werten zu werfen brauchte ich selbst auf die Probe wollte.

Verwandte Themen