Recharger ou actualiser un Printemps contexte de l'application à l'intérieur d'une méthode d'essai?
J'ai besoin de changer le Printemps des profils qui sont actives dans mes applicationContext au sein d'une seule méthode de ma classe de test, et pour ce faire j'ai besoin d'exécuter une ligne de code avant d'actualiser le concours parce que je suis à l'aide d'un ProfileResolver. J'ai essayé ce qui suit:
@WebAppConfiguration
@ContextConfiguration(locations = {"/web/WEB-INF/spring.xml"})
@ActiveProfiles(resolver = BaseActiveProfilesResolverTest.class)
public class ControllerTest extends AbstractTestNGSpringContextTests {
@Test
public void test() throws Exception {
codeToSetActiveProfiles(...);
((ConfigurableApplicationContext)this.applicationContext).refresh();
... tests here ...
codeToSetActiveProfiles(... back to prior profiles ...);
... ideally refresh/reload the context for future tests
}
}
Mais j'obtiens:
java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once
DirtiesContext ne fonctionne pas pour moi, parce qu'il est exécuté APRÈS la classe/l'exécution de la méthode, pas avant, et j'ai besoin d'exécuter une ligne de code avant l'exécution de la "rafraîchir" de toute façon.
Des suggestions? J'ai essayé de regarder les auditeurs et les crochets qui sont en cours d'exécution, mais je n'ai pas vu un endroit visible pour insérer moi-même pour obtenir ce comportement.
OriginalL'auteur David E | 2014-07-13
Vous devez vous connecter pour publier un commentaire.
Par la conception, la programmation rafraîchissante d'un
ApplicationContext
n'est pas explicitement pris en charge par le Printemps TestContext Cadre. En outre, il n'est pas prévu qu'un test de la méthode d'actualisation des un contexte.Donc je vous recommande de réévaluer votre besoin d'un rafraîchissement et d'envisager des solutions de rechange comme le placement des méthodes d'essai qui nécessitent un ensemble différent de profils actifs dans une classe de test.
En résumé,
@ActiveProfiles
prend en charge déclarative de configuration (viavalue
etprofiles
attributs) et programmatique de configuration (via leresolver
attribut) de l'actif des profils pour les tests, mais seulement à la classe de test de niveau (pas au niveau de la méthode). Une autre option est de mettre en œuvre uneApplicationContextInitializer
et de le configurer via@ContextConfiguration(initializers=...)
.La seule autre façon d'affecter la
ApplicationContext
avant il est actualisé est de mettre en œuvre unSmartContextLoader
ou de prolonger l'une des classes et de le configurer via@ContextConfiguration(loader=...)
. Par exemple,AbstractGenericContextLoader.customizeContext()
permet de "personnaliser laGenericApplicationContext
créé par le chargeur après bean définitions ont été chargés dans le contexte, mais avant le contexte est actualisé."Cordialement,
Sam (auteur de la Spring Framework TestContext)
ApplicationContext
de classes que l'Generic
. Mais je sais aussi qu'il est beaucoup plus confortable à utiliser le Printemps outils de test ...Merci pour votre réponse Sam, super d'avoir un expert en la question. J'ai eu un coup d'oeil par le biais de ce qui est fourni à
AbstractGenericWebContextLoader.customizeContext
, qui est unGenericWebApplicationContext
et unWebMergedContextConfiguration
. Je ne vois pas de méthodes pour définir des profils, pouvez-vous me donner un pointeur?Sur un
GenericWebApplicationContext
vous pouvez invoquercontext.getEnvironment().setActiveProfiles(...)
, etc.Concernant des exemples de
SmartContextLoader
implémentations, vous pouvez Google pour "implémente SmartContextLoader" (y compris les guillemets), mais qui ne renvoient pas beaucoup de résultats, car la plupart des gens à prolongerAbstractContextLoader
ouAbstractGenericContextLoader
. Par exemple, le Printemps de Démarrage introduit ses propresSpringApplicationContextLoader
qui s'étend directementAbstractContextLoader
.Merci Sam, j'apprécie les réponses grands, et le grand cadre. Nous avons été tout simplement bavarder aujourd'hui en interne sur la façon douloureuse, il aurait été de faire des tests avant. Merci pour votre dur travail!
OriginalL'auteur Sam Brannen
Pas tous les contextes d'application de multiple de soutien
refresh
. Selon javadoc pourAbstractRefreshableApplicationContext
seulement les sous-classes ou deAbstractRefreshableWebApplicationContext
accepterrefresh
plus d'une fois ... etGenericApplicationContext
pas.Vous devez utiliser une autre classe pour votre
ApplicationContext
à l'appui de rafraîchissement chaude.Edit :
Que vous utilisez
@ContextConfiguration
d'annotation, vous devez utiliser un customContextLoader
ouSmartContextLoader
mise en œuvre de ressort à force d'utiliser un moins stupideApplicationContext
. Mais je n'ai jamais trouvé un endroit propre et soigné de façon à de que. Alors, quand j'ai besoin d'unXmlWebApplicationContext
dans mes classes de test, je n'utilise pas@ContextConfiguration
mais de créer et d'actualiser mes contexte à la main dans un@Before
méthode ou au début d'un test.Je reconnais que ce n'est pas vraiment répondre à votre question, mais vous pouvez la voir comme une solution de contournement.
Oups, n'a pas remarqué que vous utilisiez un
@ContextConfiguration
... j'ai juste mis à jour mon post.OriginalL'auteur Serge Ballesta
Il y a un joli petit hack pour déclencher un contexte d'actualisation à utiliser
org.springframework.cloud.context.refresh.ContextRefresher
.Je ne suis pas 100% sûr que cette méthode est la suite: il exige un
spring-cloud-context
de dépendance. Cependant, cela peut être ajoutée tout comme unetest
dépendance et pas de fuite en production classpath.Pour utiliser cette recyclage vous devez également importer
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration
de configuration, ce qui ajoute uneRefreshScope
portée à votreapplicationContext
qui est en train de faire le travail sous le capot.De modifier le test comme suit:
OriginalL'auteur Ivan Pronin