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