web-dev-qa-db-fra.com

Injection de dépendance de printemps avec TestNG

Spring supporte JUnit assez bien à ce sujet: avec les annotations RunWith et ContextConfiguration, les choses semblent très intuitives

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dao-context.xml")

Ce test pourra s'exécuter correctement dans Eclipse et Maven. Je me demande s'il y a des trucs similaires pour TestNG. J'envisage de passer à ce framework "Next Generation" mais je n'ai pas trouvé de correspondance pour les tests avec Spring.

54
56
lexicore

Voici un exemple qui a fonctionné pour moi:

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!
    }
}
25
Arup Malakar

Spring et TestNG fonctionnent bien ensemble, mais il y a certaines choses à savoir. En plus de sous-classer AbstractTestNGSpringContextTests, vous devez être conscient de la façon dont il interagit avec les annotations de configuration/démontage TestNG standard.

TestNG a quatre niveaux de configuration

  • BeforeSuite
  • BeforeTest
  • Avant les cours
  • BeforeMethod

qui se produisent exactement comme vous vous en doutez (excellent exemple d'API auto-documentées). Celles-ci ont toutes une valeur facultative appelée "dependOnMethods" qui peut prendre une chaîne ou une chaîne [], qui est le ou les noms des méthodes au même niveau.

La classe AbstractTestNGSpringContextTests possède une méthode annotée BeforeClass appelée springTestContextPrepareTestInstance, dont vous devez définir la méthode de configuration en fonction de si vous utilisez une classe câblée automatiquement. Pour les méthodes, vous n'avez pas à vous soucier du câblage automatique, car il se produit lorsque la classe de test est configurée dans la méthode avant la classe.

Cela laisse simplement la question de savoir comment utiliser une classe câblée automatiquement dans une méthode annotée avec BeforeSuite. Vous pouvez le faire en appelant manuellement springTestContextPrepareTestInstance - bien que ce ne soit pas configuré par défaut pour le faire, je l'ai fait plusieurs fois avec succès.

Donc, pour illustrer, une version modifiée de l'exemple d'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!
    }
}
18
romeara