web-dev-qa-db-fra.com

Réutilisation du contexte d'application Spring dans toutes les classes de test Junit

Nous avons un grand nombre de cas de test JUnit (tests d'intégration) et ils sont logiquement regroupés dans différentes classes de test.

Nous sommes en mesure de charger le contexte d'application Spring une fois par classe de test et de le réutiliser pour tous les tests dans une classe de test JUnit, comme indiqué dans la section http://static.springsource.org/spring/docs/current/spring -framework-reference/html/testing.html

Cependant, nous nous demandions simplement s'il était possible de charger le contexte d'application Spring une seule fois pour un ensemble de classes de test JUnit.

FWIW, nous utilisons Spring 3.0.5, JUnit 4.5 et utilisons Maven pour générer le projet.

73
Ramesh

Oui, c'est parfaitement possible. Tout ce que vous avez à faire est d'utiliser le même attribut locations dans vos classes de test:

@ContextConfiguration(locations = "classpath:test-context.xml")

Spring met en cache les contextes d'application par l'attribut locations. Par conséquent, si le même locations apparaît pour la deuxième fois, Spring utilise le même contexte plutôt que d'en créer un nouveau.

J'ai écrit un article sur cette fonctionnalité: Accélération des tests d'intégration Spring . En outre, il est décrit en détail dans la documentation Spring: 9.3.2.1 Gestion du contexte et mise en cache .

Cela a une implication intéressante. Comme Spring ne sait pas quand JUnit est terminé, il met en cache tout le contexte pour toujours et les ferme à l'aide du hook d'arrêt JVM. Ce comportement (surtout lorsque vous avez beaucoup de classes de test avec différentes locations) peut entraîner une utilisation excessive de la mémoire, des fuites de mémoire, etc. Un autre avantage du contexte de mise en cache.

83
Tomasz Nurkiewicz

Pour ajouter à réponse de Tomasz Nurkiewicz , à compter du printemps 3.2.2 @ContextHierarchy annotation peut être utilisé pour avoir une structure de contexte multiple associée distincte. Ceci est utile lorsque plusieurs classes de test souhaitent partager (par exemple) des configurations de base de données en mémoire (source de données, EntityManagerFactory, gestionnaire de transmission, etc.).

Par exemple:

@ContextHierarchy({
  @ContextConfiguration("/test-db-setup-context.xml"),
  @ContextConfiguration("FirstTest-context.xml")
})
@RunWith(SpringJUnit4ClassRunner.class)
public class FirstTest {
 ...
}

@ContextHierarchy({
  @ContextConfiguration("/test-db-setup-context.xml"),
  @ContextConfiguration("SecondTest-context.xml")
})
@RunWith(SpringJUnit4ClassRunner.class)
public class SecondTest {
 ...
}

Avec cette configuration, le contexte qui utilise "test-db-setup-context.xml" ne sera créé qu'une seule fois, mais les beans qu'il contient peuvent être injectés dans le contexte du test d'unité individuel.

Plus sur le manuel: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (recherche de "-" hiérarchie de contexte ")

25
gerrytan