2012-04-17 14 views
5

Desidero registrare alcuni ambiti Web nel contesto di primavera nel mio metodo @BeforeTest. Ma si scopre che il contesto di primavera è ancora null a quel punto.Accesso al contesto di primavera nel test @BeforeTest

Il test funziona benissimo, se cambio in @BeforeMethod. Mi chiedo come posso accedere al contesto in @BeforeTest, perché non voglio che il codice di registrazione dell'oscilloscopio venga ripetuto per ogni metodo di prova.

Di seguito sono riportati i frammenti di codice.

public class MyTest extends MyBaseTest { 
    @Test public void someTest() { /*...*/ } 
} 

@ContextConfiguration(locations="/my-context.xml") 
public class MyBaseTest extends AbstractTestNGSpringContextTests { 
    @BeforeTest public void registerWebScopes() { 
     ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
       this.applicationContext.getAutowireCapableBeanFactory(); 
     factory.registerScope("session", new SessionScope()); 
     factory.registerScope("request", new RequestScope()); 
    } 

    /* some protected methods here */ 
} 

Ecco il messaggio di errore quando si esegue il test:

 
FAILED CONFIGURATION: @BeforeTest registerWebScopes 
java.lang.NullPointerException 
    at my.MyBaseTest.registerWebScopes(MyBaseTest.java:22) 

risposta

12

chiamata springTestContextPrepareTestInstance() nel metodo BeforeTest.

+0

Sei a conoscenza di qualsiasi documentazione sul motivo per cui i membri iniettati non sono disponibili nei metodi '@ BeforeTest' e anche' @ BeforeSuite'? – ecbrodie

+0

10x :) è più facile quindi scrivere post processor di bean –

2

TestNG esegue i metodi @BeforeTest prima dei metodi @BeforeClass. Lo springTestContextPrepareTestInstance() è annotato con @BeforeClass e configura lo applicationContext. Questo è il motivo per cui lo applicationContext è ancora null in un metodo @BeforeTest. @BeforeTest serve per scambiare un gruppo di test con tag. (Non funziona prima di ogni metodo @Test, quindi è un po 'improprio).

Invece di utilizzare @BeforeTest, è consigliabile utilizzare @BeforeClass (che viene eseguito una volta, prima del primo @Test nella classe corrente). Assicurarsi che dipende springTestContextPrepareTestInstance metodo, come in

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance") 
public void registerWebScopes() { 
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
      this.applicationContext.getAutowireCapableBeanFactory(); 
    factory.registerScope("session", new SessionScope()); 
    factory.registerScope("request", new RequestScope()); 
} 

I @BeforeMethod opere, anche (come lei ha ricordato) perché corrono dopo @BeforeClass metodi.

+0

"' @ BeforeClass' (eseguito prima di qualsiasi '@ Tests' nella classe corrente)". <- Questo non è corretto. Come indicato in [TestNG documentation] (http://testng.org/doc/documentation-main.html), '@ BeforeClass' verrà eseguito prima che venga chiamato ** il primo ** metodo di test nella classe corrente. – JonyD

+0

@JonyD, grazie per averlo indicato, la dicitura non è chiara. L'ho modificato in base al tuo suggerimento. – kuporific

Problemi correlati