es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo envolver todas las pruebas de junit?

¿Cómo puedo crear una extensión/regla/interceptor de JUnit5 que envuelva automáticamente cada método @Test?

Ejemplo: imaginemos que queremos medir el tiempo de ejecución:

class TimeExtension {
    runTest() {
         StopWatch w = new StopWatch();
         w.start();

         // realmente ejecutar la prueba original
         test.run();

         w.stop();
    }
}

¿Cómo se podría aplicar esto a cualquier clase de prueba?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una extensión junit5 que envuelva automáticamente cada método @Test, sigue los siguientes pasos:

    1. Crea una clase que implemente las interfaces BeforeTestExecutionCallback y AfterTestExecutionCallback. Esta clase actuará como la extensión.
    2. Implementa los métodos beforeTestExecution y afterTestExecution que envolverán el método @Test.

    3. En el método beforeTestExecution, instancia y comienza el temporizador.

    4. En el método afterTestExecution, detén el temporizador e imprime el tiempo de ejecución.

    Ejemplo:

    import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
    import org.junit.jupiter.api.extension.ExtensionContext;
    import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
    import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
    import org.junit.jupiter.api.extension.TestExtensionContext;
    
    public class TimeExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback {
    
        @Override
        public void beforeTestExecution(TestExtensionContext context) {
            System.out.println("Comenzando temporizador...");
            StopWatch w = new StopWatch();
            w.start();
            context.getStore().put("timer", w);
        }
    
        @Override
        public void afterTestExecution(TestExtensionContext context) {
            StopWatch w = context.getStore().remove("timer", StopWatch.class);
            w.stop();
            System.out.println("Tiempo de ejecución: " + w.getTime() + "ms");
        }
    }
    

    Para aplicar esta extensión a cualquier clase de prueba, agrega la anotación @ExtendWith(TimeExtension.class) a la clase de prueba.

    Ejemplo:

    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    
    @ExtendWith(TimeExtension.class)
    class ExampleTest {
    
        @Test
        void testExample() {
            // código de prueba...
        }
    }
    

    Esto envolverá automáticamente el método @Test con la extensión TimeExtension e imprimirá el tiempo de ejecución.

Comments are closed.