2012-04-17 15 views
5

Me gustaría registrar algunos ámbitos web en el contexto de primavera en mi método @BeforeTest. Pero resulta que el contexto de primavera todavía es null en ese punto.Accediendo al contexto de la primavera en testng @BeforeTest

La prueba funciona bien, si cambio a @BeforeMethod. Me pregunto cómo puedo acceder al contexto en @BeforeTest, porque no quiero que el código de registro del alcance se repita para cada método de prueba.

A continuación se muestran mis fragmentos de código.

public class MyTest extends MyBaseTest { 
    @Test public void someTest() { /*...*/ } 
} 

@ContextConfiguration(locations="/my-context.xml") 
public class MyBaseTest extends AbstractTestNGSpringContextTests { 
    @BeforeTest public void registerWebScopes() { 
     ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
       this.applicationContext.getAutowireCapableBeanFactory(); 
     factory.registerScope("session", new SessionScope()); 
     factory.registerScope("request", new RequestScope()); 
    } 

    /* some protected methods here */ 
} 

Aquí está el mensaje de error cuando se ejecuta la prueba:

 
FAILED CONFIGURATION: @BeforeTest registerWebScopes 
java.lang.NullPointerException 
    at my.MyBaseTest.registerWebScopes(MyBaseTest.java:22) 

Respuesta

12

llamada springTestContextPrepareTestInstance() en su método BeforeTest.

+0

¿Conoce alguna documentación sobre por qué los miembros inyectados no están disponibles en los métodos '@ BeforeTest' e incluso' @ BeforeSuite'? – ecbrodie

+0

10x :) es más fácil escribir post procesador de frijoles –

2

TestNG ejecuta @BeforeTest métodos antes de @BeforeClass métodos. El springTestContextPrepareTestInstance() está anotado con @BeforeClass y configura el applicationContext. Esta es la razón por la cual el applicationContext sigue siendo null en un método @BeforeTest. @BeforeTest es para eliminar un grupo etiquetado de pruebas. (No se ejecuta antes de cada método @Test, por lo que es un nombre poco apropiado).

En lugar de usar @BeforeTest, probablemente debería usar @BeforeClass (que se ejecuta una vez, antes del primer @Test en la clase actual). Asegúrese que depende de springTestContextPrepareTestInstance método, como en

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance") 
public void registerWebScopes() { 
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
      this.applicationContext.getAutowireCapableBeanFactory(); 
    factory.registerScope("session", new SessionScope()); 
    factory.registerScope("request", new RequestScope()); 
} 

Los @BeforeMethod obras, también (como usted ha mencionado), ya que corren detrás de @BeforeClass métodos.

+0

"' @ BeforeClass' (ejecutar antes de cualquier '@ Pruebas' en la clase actual)". <- Esto es incorrecto. Como se indica en [Documentación de TestNG] (http://testng.org/doc/documentation-main.html), se ejecutará '@ BeforeClass' antes de invocar el método de prueba ** first ** en la clase actual. – JonyD

+0

@JonyD, gracias por señalar esto, la redacción no está clara. Lo he editado según tu sugerencia. – kuporific

Cuestiones relacionadas