web-dev-qa-db-fra.com

spring Dois-je utiliser @DirtiesContext sur chaque classe

J'ai plusieurs tests junit,

@ContextConfiguration(locations = { "file:../business/src/test/resources/application-context-test.xml",
        "file:src/main/webapp/WEB-INF/confA.xml", "classpath:/mvc-dispatcher-servlet-test.xml"})
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class ProductContentControllerTest {
...
}

À l'intérieur d'une classe, tous les tests doivent être exécutés dans le même contexte (ce qui est le cas).

Mais je veux que toutes mes classes de tests soient indépendantes. Je supposais que c'était le comportement par défaut, mais quand je lance tous les tests ensemble, il semble fonctionner trop vite.

Comment ça marche? Le contexte d'application est-il démarré une seule fois pour chaque classe de test?

Dois-je ajouter: @DirtiesContext (classMode = ClassMode.AFTER_CLASS)

sur chaque classe de test?

merci

19
jpprade

Spring met en cache le contexte de l'application par défaut lors de l'exécution des tests. La clé que Spring utilise pour le cache est composée des éléments suivants:

  • emplacements (de @ContextConfiguration)
  • classes (de @ContextConfiguration)
  • contextInitializerClasses (de @ContextConfiguration)
  • contextLoader (de @ContextConfiguration)
  • activeProfiles (de @ActiveProfiles)
  • resourceBasePath (de @WebAppConfiguration)

Tous les détails de la mise en cache peuvent être trouvés dans le documentation .

D'après mon expérience, il est rarement nécessaire d'utiliser @DirtiesContext afin de forcer Spring à recréer le contexte. Je n'ai pas rencontré trop de situations où cela est nécessaire - la seule qui me vient facilement à l'esprit est l'utilisation d'un gestionnaire de cache partagé.

Il vaut mieux l'utiliser uniquement sur des tests dont vous en avez absolument besoin. La vitesse d'exécution sera beaucoup trop lente si vous utilisez @DirtiesContext à chaque test et vous n'obtiendrez rien en retour.

30
geoand