test mvc example context spring junit integration-testing applicationcontext

mvc - Corredor personalizado JUnit con contexto de aplicación Spring



spring mvc test (1)

Puede crear una clase de prueba base: @ContextConfiguration se puede heredar, así como @Before , @Before , y así sucesivamente:

@ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" }) public abstract class myBaseTest { @Before public void init() { // custom initialization code for resources loaded by testContext.xml } @After public void cleanup() { // custom cleanup code for resources loaded by testContext.xml } } @RunWith(SpringJUnit4ClassRunner.class) public class myTest extends myBaseTest { ... }

Soy bastante nuevo en Spring y estoy trabajando con un conjunto de pruebas de integración de JUnit 4.7 para una aplicación web. Tengo varios casos de prueba de trabajo del formulario:

import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" }) public class myTest { @Test public void testCreate() { //execute tests .... } }

Mi aplicación tiene una cantidad de dependencias externas que estoy probando, todas las cuales tienen beans que se inicializan mediante la carga de testContext.xml . Algunas de estas dependencias externas requieren un código personalizado para inicializar y eliminar los recursos necesarios.

En lugar de duplicar este código en cada clase de prueba que lo requiera, me gustaría encapsularlo en una ubicación común. Mi idea era crear una definición de contexto separada, así como un corredor personalizado que extienda SpringJUnit4ClassRunner y contenga la anotación @ContextConfiguration y el código personalizado relacionado, así:

import org.junit.runners.model.InitializationError; import org.junit.runners.model.Statement; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; //load the context applicable to this runner @ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" }) public class MyCustomRunner extends SpringJUnit4ClassRunner { public MyCustomRunner(Class<?> clazz) throws InitializationError { super(clazz); } @Override protected Statement withBeforeClasses(Statement statement) { // custom initialization code for resources loaded by testContext.xml ... return super.withBeforeClasses(statement); } @Override protected Statement withAfterClasses(Statement statement) { // custom cleanup code for resources loaded by testContext.xml .... return super.withAfterClasses(statement); } }

Entonces podría hacer que cada clase de prueba especifique su corredor aplicable con:

@RunWith(MyCustomRunner)

Cuando hago esto, se ejecutan mis pruebas y se ejecutan los métodos conBeforeClasses y WithAfterClasses . Sin embargo, no se proporciona ningún applicationContext a la clase de prueba y todas mis pruebas fallan con:

java.lang.IllegalArgumentException: No se puede cargar un ApplicationContext con un NULL ''contextLoader''. Considere anotar su clase de prueba con @ContextConfiguration.

El contexto solo se carga correctamente si especifico la anotación @ContextConfiguration en cada clase de prueba; idealmente, me gustaría que esta anotación permanezca con el código del controlador para los recursos que es responsable de cargar. Lo que me lleva a mi pregunta: ¿es posible cargar información sobre el contexto de Spring desde una clase de corredor personalizada?