java junit rule

java - Junit @Rule y @ClassRule



(3)

Estoy escribiendo la prueba JUnit4 en la que estoy usando la regla TemporaryFolder. Parece que funciona bien tanto con @Rule como con @ClassRule. ¿Cuál es la diferencia entre Junit @Rule y @ClassRule? ¿Por qué debería usar uno y no otro?


La distinción se hace clara cuando tiene más de un método de prueba en una clase.

A @ClassRule tiene su método before() ejecutado antes de cualquiera de los métodos de prueba. Luego se ejecutan todos los métodos de prueba y, finalmente, el método after() la regla. Por lo tanto, si tiene cinco métodos de prueba en una clase, before() y after() solo se ejecutarán una vez cada uno.

@ClassRule aplica a un método estático, y por lo tanto tiene todas las limitaciones inherentes a eso.

Una @Rule hace que las pruebas se ejecuten a través del método apply() la regla, que puede hacer cosas antes y después de que se ejecute el método de destino. Si tiene cinco métodos de prueba, se apply() la regla apply() cinco veces, como un contenedor alrededor de cada método.

Use @ClassRule para configurar algo que pueda reutilizarse con todos los métodos de prueba, si puede lograrlo con un método estático.

Use @Rule para configurar algo que deba crearse nuevamente, o restablecer, para cada método de prueba.


No se puede configurar @Rule para que se ejecute antes de una @BeforeClass.

Mientras que @ClassRule debe estar en método estático.


Ref: Anota campos estáticos que hacen referencia a reglas o métodos que los devuelven. Un campo debe ser público, estático y un subtipo de TestRule. Un método debe ser público estático y devolver un subtipo de TestRule.

La Declaración pasada a TestRule ejecutará cualquier método BeforeClass, luego todo el cuerpo de la clase de prueba (todos los métodos contenidos, si es una clase de prueba JUnit estándar, o todas las clases contenidas, si es una Suite), y finalmente cualquier clase posterior metodos

https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html