Saltar al contenido

¿Recargar o actualizar un contexto de aplicación Spring dentro de un método de prueba?

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 ApplicationContextantes 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *