2010-04-09 11 views
43
JUnit apoyo

primavera bastante bien en lo siguiente: Con la RunWith y ContextConfiguration anotación, las cosas se ven muy intuitivaprimavera inyección de dependencias con TestNG

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:dao-context.xml") 

Esta prueba será capaz de funcionar tanto en Eclipse & Maven correctamente. Me pregunto si hay algo similar para TestNG. Estoy considerando pasar a este Marco de "Próxima Generación", pero no encontré una coincidencia para probar con Spring.

Respuesta

51
+0

Gracias. Eso es exactamente lo que estoy buscando. –

+4

¡Qué desastre! Primero aplica jerarquía de clase específica. En segundo lugar, es bastante confuso ya que el caso de prueba que usa '@ Transactional' puede extender la versión no transaccional por error. Pero desafortunadamente no hay otra manera de usar un Spring con TestNG. –

+0

@GrzesiekD. Mi esperanza es que algo haya cambiado en 4.5 años. :) Por lo tanto, vuelva a verificar el estado actual. – lexicore

23

Este es un ejemplo que trabajó para mí:

import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.annotations.Test; 

@Test 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class TestValidation extends AbstractTestNGSpringContextTests { 

    public void testNullParamValidation() { 
     // Testing code goes here! 
    } 
} 
17

Primavera y T ESTÁN TRABAJANDO BIEN Juntos, pero hay algunas cosas que deben tenerse en cuenta. Además de la subclasificación de AbstractTestNGSpringContextTests, debe tener en cuenta cómo interactúa con las anotaciones estándar de configuración/desmantelamiento de TestNG.

TestNG tiene cuatro niveles de configuración

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeMethod

que ocurren exactamente como era de esperar (gran ejemplo de API autodocumentado) Todos estos tienen un valor opcional llamado "dependsOnMethods" que puede tomar un String o String [], que es el nombre o los nombres de los métodos en el mismo nivel.

La clase AbstractTestNGSpringContextTests tiene un método anotado BeforeClass llamado springTestContextPrepareTestInstance, que debe establecer su método de configuración para que dependa de si está utilizando una clase autocableada en él. Para los métodos, no tiene que preocuparse por el autoenvío, ya que ocurre cuando la clase de prueba está configurada en ese método anterior a la clase.

Esto simplemente deja la pregunta de cómo se puede utilizar una clase autoelertada en un método anotado con BeforeSuite. Puede hacer esto llamando manualmente a springTestContextPrepareTestInstance, aunque no está configurado de manera predeterminada para hacer esto, lo he hecho varias veces con éxito.

Así, para ilustrar, una versión modificada del ejemplo de Arup:

import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.annotations.Test; 

@Test 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class TestValidation extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private IAutowiredService autowiredService; 

    @BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"}) 
    public void setupParamValidation(){ 
     // Test class setup code with autowired classes goes here 
    } 

    @Test 
    public void testNullParamValidation() { 
     // Testing code goes here! 
    } 
} 
+0

El método org.springframework.test.context.testng.AbstractTestNGSpringContextTests # springTestContextPrepareTestInstance ya tiene la anotación @BeforeClass por lo que esta solución me parece redundante. –

+1

Esta solución le permite agregar código dependiente de campo de autowire a su prueba. "springTestContextPrepareTestInstance" es un método "antes de clase" que no garantiza que se ejecutará antes de la "clase anterior" de una subclase; debe establecer explícitamente el campo dependsOnMethods – romeara

+2

Desafortunadamente, esto no funciona para mí. De forma predeterminada, el '@ Autowire' parece tener lugar MUY tarde, después de @BeforeTest (pero antes de @Test). Intenté agregar el método dependsOnMethods, pero luego obtuve: MyClass depende del método protected void org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance() arroja java.lang.Exception, que no está anotado con @Test ... – dmansfield

Cuestiones relacionadas