2012-03-28 25 views
30

En mi proyecto tengo que hacer alguna configuración de repositorio antes de todas las pruebas. Esto se hace usando algunas reglas estáticas difíciles. Sin embargo, no tengo ni idea de cómo hacer la limpieza después de todas las pruebas. No quiero mantener un número estático mágico que haga referencia al número de todos los métodos de prueba, que debo mantener todo el tiempo.Limpieza después de todas las pruebas junit

La forma más apreciada es agregar algún oyente que se invocaría después de todas las pruebas. ¿Ya hay alguna interfaz para JUnit4?


editar: esto no tiene nada que ver con @BeforeClass y @AfterClass, porque tengo que saber si el método anotado con @AfterClass se invoca por última vez.

+0

Una limpia ** ** TestNG solución se puede encontrar aquí: http://stackoverflow.com/a/26381858/1857897 – dedek

Respuesta

30

Estoy usando JUnit 4.9. Ayudará esto ?:

import junit.framework.TestCase; 

import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({First.class,Second.class,Third.class}) 
public class RunTestSuite extends TestCase { 
    @BeforeClass 
    public static void doYourOneTimeSetup() { 
     ... 
    } 

    @AfterClass 
    public static void doYourOneTimeTeardown() { 
     ... 
    }  
} 

Editar: Soy bastante positivo (a menos que usted pregunta malinterpreten) que mi solución es lo que busca. es decir, un método de desmontaje después de que se hayan ejecutado todas las pruebas. No se requiere oyente, JUnit tiene esta facilidad. Gracias.

+1

estoy bastante seguro de que esto va a lograr su objetivo, a menos que entienden mal su pregunta. – HellishHeat

+6

Tendría que enumerar todas las clases de prueba (que incluso ahora es varias, y la cuenta crecerá rápidamente), por lo que lamentablemente no es aceptable –

+1

Lo siento, hombre, simplemente no sé lo que está tratando de hacer. No tengo idea de por qué tienes que enumerar algo. Le sugiero que agregue más detalles a su pregunta porque, tal como está, indica que desea que se lleve a cabo un comportamiento estático al final de la ejecución de prueba, después de que se hayan ejecutado todas las pruebas. Eso es todo lo que has especificado. Si ese fue el caso, entonces mi solución hace eso. Tenga en cuenta que NO estoy ejecutando AfterClass después de cada una de sus pruebas. Estoy usando la anotación AfterClass en AllTests. SO se llamará después de Todas las Pruebas. Tal vez simplemente no lo entiendo :) – HellishHeat

1

Siempre puede escribir su TestRunner personalizado. Sin embargo, antes de hacer eso, necesita evaluar la necesidad de lo mismo. Es mejor usar @BeforeClass y @AfterClass. Otro ejemplo que puedo señalar es la forma en que hibernate permite a los usuarios hacer pruebas unitarias usando 'import.sql'.

34

me recomiendan usar org.junit.runner.notification.RunListener, ejemplo:

public class TestListener extends RunListener { 
    @Override 
    public void testRunStarted(Description description) throws Exception { 
    // Called before any tests have been run. 
    } 
    @Override 
    public void testRunFinished(Result result) throws Exception { 
    // Called when all tests have finished 
    } 
} 

Leer más directamente en el doc JUnit Java. Puede usar que incluso con éxito seguro de Maven (pruebas unitarias) plugin o complemento a prueba de fallos (pruebas de integración) mediante la adición siguiente código en la configuración del plugin:

<properties> 
    <property> 
    <name>listener</name> 
    <value>com.innovatrics.afismq.it.TestListener</value> 
    </property> 
</properties> 
+1

Me gusta mucho esta solución. No tiene que nombrar todas las clases – committedandroider

1

No hay necesidad de usar paquete, sólo tiene que añadir @BeforeClass y @AfterClass como estática

public class Tests { 

    @BeforeClass 
    public static void doYourOneTimeSetup() 
    { 
     ... 
    } 

    @AfterClass 
    public static void doYourOneTimeTeardown() { 
     ... 
    }  

    @Test 
    public void testYourTestcase() 
    { 
     ... 
    } 
} 
+1

Esto no funciona si tiene más de una clase de prueba. –

+0

sí, está en el alcance de la clase – serup

Cuestiones relacionadas