2012-07-03 10 views
52

Vorrei scrivere alcuni test per verificare la configurazione XML Spring di una WAR distribuita. Sfortunatamente alcuni bean richiedono che vengano impostate alcune variabili d'ambiente o proprietà di sistema. Come posso impostare una variabile di ambiente prima che i bean a molla vengano inizializzati quando si utilizza lo stile di test conveniente con @ContextConfiguration?Come impostare la variabile di ambiente o la proprietà di sistema nei test di primavera?

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

Se devo configurare il contesto applicativo con annotazioni, non vedo un gancio dove posso fare qualcosa prima che il contesto molla viene inizializzato.

risposta

75

È possibile inizializzare la proprietà di sistema in un inizializzatore statico:

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

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

} 

Il codice di inizializzazione statico verrà eseguito prima che il contesto di applicazione molla è inizializzata.

+8

Sciocco me - OK, che avrebbe funzionato. Ancora meglio: probabilmente un metodo '@ BeforeClass' per impostare la proprietà di sistema e un metodo' @ AfterClass' per rimuoverlo funzionerebbe, e pulirà bene dopo di sé. (Non provate fuori, però.) –

+1

provato il @BeforeClass - e ha funzionato bene per l'impostazione delle proprietà di sistema prima di altre proprietà sono state impostate nel caso di test – wbdarby

+0

Grazie per questo. La cosa statica non funzionava, ma un piccolo metodo con @BeforeClass funzionava! –

45

Il modo giusto per fare questo, a partire da Primavera 4.1, è quello di utilizzare un'annotazione @TestPropertySource.

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

See @TestPropertySource nel Spring docs e Javadocs.

+1

Questa annotazione supporta anche un percorso del file delle proprietà. – MigDus

+2

ho potuto cambiare l'etichetta client cloud Config primavera durante i test utilizzando '@TestPropertySource (proprietà = { "spring.cloud.config.label = funzione/filiali"})' –

+0

buona risposta, ma purtroppo non ha funzionato per me, utilizzando Primavera 4.2.9, la proprietà era sempre vuota. Solo il blocco statico ha funzionato ... Ha funzionato per le proprietà dell'applicazione, ma non per le proprietà di sistema. – Gregor

4

Si può anche utilizzare un ApplicationContextInitializer di prova per inizializzare una proprietà di sistema:

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

e quindi configurarlo sulla classe di test in aggiunta alle posizioni dei file Primavera contesto di configurazione:

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

Questo la duplicazione del codice di modo può essere evitata se è necessario impostare una determinata proprietà di sistema per tutti i test unitari.

0

Se si desidera che le variabili siano valide per tutti i test, è possibile avere un file application.properties nella directory delle risorse di test (per impostazione predefinita: src/test/resources), che sarà simile a questa:

MYPROPERTY=foo 

Questo sarà quindi essere caricato e utilizzato a meno che non si dispone di definizioni tramite @TestPropertySource o un metodo simile - l'ordine esatto in cui le proprietà sono caricati può essere trovata nella primavera documentazione capitolo 24. Externalized Configuration.

Problemi correlati