Iniezione primavera dipendenza con TestNG
Domanda
Supporto Primavera JUnit abbastanza bene su questo:
Con la RunWith
e ContextConfiguration
annotazioni, le cose sembrano molto intuitivo
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dao-context.xml")
Questo test sarà in grado di eseguire sia in Eclipse e Maven in modo corretto. Mi chiedo se c'è roba simile per TestNG. Sto pensando di trasferirsi in questo "Next Generation" quadro, ma non ho trovato una corrispondenza per il test con la Primavera.
Soluzione
Funziona con TestNG pure. Il tuo test le esigenze di classe a estendere una delle seguenti classi:
Altri suggerimenti
Ecco un esempio che ha funzionato per me:
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {
public void testNullParamValidation() {
// Testing code goes here!
}
}
La primavera e TestNG funzionano bene insieme, ma ci sono alcune cose da tenere presente. A parte sottoclasse AbstractTestNGSpringContextTests, è necessario essere consapevoli di come interagisce con TestNG standard di annotazioni setup / teardown.
TestNG ha quattro livelli di configurazione
- BeforeSuite
- BeforeTest
- BeforeClass
- BeforeMethod
che si verificano esattamente come ci si aspetterebbe (grande esempio di API auto-documentazione). Questi hanno tutti un valore opzionale chiamata "dependsOnMethods" che può richiedere una stringa o String [], che è il nome o la ragione (s) dei metodi allo stesso livello.
La classe AbstractTestNGSpringContextTests ha un metodo annotato BeforeClass chiamato springTestContextPrepareTestInstance, che è necessario impostare il metodo di configurazione a dipendere da se si utilizza una classe autowired in esso. Per i metodi, non c'è bisogno di preoccuparsi per l'autowiring, dal momento che si verifica quando la classe di test è configurato in che prima di metodo di classe.
Questo lascia solo la questione di come si potrebbe utilizzare una classe autowired in un metodo annotato con BeforeSuite. È possibile farlo chiamando manualmente springTestContextPrepareTestInstance -. Mentre la sua non è l'installazione di default per fare questo, ho fatto più volte con successo
Quindi, per illustrare, una versione modificata del l'esempio di Arup:
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {
@Autowired
private IAutowiredService autowiredService;
@BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"})
public void setupParamValidation(){
// Test class setup code with autowired classes goes here
}
@Test
public void testNullParamValidation() {
// Testing code goes here!
}
}