Nuestros mejores desarrolladores han agotado sus reservas de café, por su búsqueda noche y día por la solución, hasta que Ada halló el resultado en Bitbucket así que ahora la comparte aquí.
Solución:
Por diseño, la actualización programática de un ApplicationContext
Spring TestContext Framework no lo admite explícitamente. Además, no se pretende que un método de prueba actualice un contexto.
Por lo tanto, le recomendaría que reevalúe su necesidad de una actualización y considere alternativas como colocar métodos de prueba que requieran un conjunto diferente de perfiles activos en una clase de prueba dedicada.
En resumen, @ActiveProfiles
apoya declarativo configuración (a través de value
y profiles
attributes) y programático configuración (a través de la resolver
attribute) de los perfiles activos para pruebas, pero solo a nivel de clase de prueba (no a nivel de método). Otra opción es implementar un ApplicationContextInitializer
y configurar eso a través de @ContextConfiguration(initializers=...)
.
La única otra manera de afectar el ApplicationContext
antes de se refresca es implementar un SmartContextLoader
o extienda una de las clases provistas y configúrela a través de @ContextConfiguration(loader=...)
. Por ejemplo, AbstractGenericContextLoader.customizeContext()
permite “personalizar el GenericApplicationContext
creado por el cargador después Las definiciones de bean se han cargado en el contexto pero antes de el contexto se refresca”.
Atentamente,
Sam (autor de Spring TestContext Framework)
Hay un pequeño truco agradable para activar una actualización de contexto: para usar org.springframework.cloud.context.refresh.ContextRefresher
.
No estoy 100% seguro de que este método te convenga: Requiere a spring-cloud-context
dependencia. Sin embargo, esto puede agregarse como un test
dependencia y no filtrarse en el classpath de producción.
Para usar este repaso, también necesita importar org.springframework.cloud.autoconfigure.RefreshAutoConfiguration
configuración, que añade un RefreshScope
alcance a su applicationContext
que en realidad está haciendo el trabajo debajo del capó.
Entonces, modifique la prueba de la siguiente manera:
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration;
import org.springframework.cloud.context.refresh.ContextRefresher;
// your other imports
@WebAppConfiguration
@ContextConfiguration(locations = "/web/WEB-INF/spring.xml", classes = RefreshAutoConfiguration.class)
@ActiveProfiles(resolver = BaseActiveProfilesResolverTest.class)
public class ControllerTest extends AbstractTestNGSpringContextTests
@Autowired
private ContextRefresher contextRefresher;
@Test
public void test() throws Exception
// doSmth before
contextRefresher.refresh();
// context is refreshed - continue testing
valoraciones y comentarios
Recuerda algo, que tienes la capacidad de decir si te fue útil.