Solución:
Las reglas se utilizan para agregar funcionalidad adicional que se aplica a todas las pruebas dentro de una clase de prueba, pero de una manera más genérica.
Por ejemplo, ExternalResource ejecuta código antes y después de un método de prueba, sin tener que usar @Before
y @After
. Usando un ExternalResource
en vez de @Before
y @After
brinda oportunidades para una mejor reutilización del código; la misma regla se puede utilizar desde dos clases de prueba diferentes.
El diseño se basó en: Interceptores en JUnit
Para obtener más información, consulte JUnit wiki: Reglas.
Junit Rules funcionan según el principio de AOP (programación orientada a aspectos). Intercepta el método de prueba, lo que brinda la oportunidad de hacer algunas cosas antes o después de la ejecución de un método de prueba en particular.
Tome el ejemplo del siguiente código:
public class JunitRuleTest {
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
@Test
public void testRule() throws IOException {
File newFolder = tempFolder.newFolder("Temp Folder");
assertTrue(newFolder.exists());
}
}
Cada vez que se ejecuta el método de prueba anterior, se crea una carpeta temporal y se elimina después de la ejecución del método. Este es un ejemplo de una regla lista para usar proporcionada por Junit.
También se puede lograr un comportamiento similar creando nuestras propias reglas. Junit proporciona la interfaz TestRule, que se puede implementar para crear nuestra propia regla Junit.
Aquí hay un enlace útil para referencia:
- http://www.codeaffine.com/2012/09/24/junit-rules/
La explicación de cómo funciona:
JUnit envuelve su método de prueba en un objeto Statement para que la declaración y Execute()
ejecuta su prueba. Entonces en lugar de llamar statement.Execute()
directamente para ejecutar su prueba, JUnit pasa la declaración a una regla de prueba con el @Rule
anotación. La función “aplicar” de TestRule devuelve una nueva declaración dada la declaración con su prueba. La nueva Declaración Execute()
El método puede llamar al método de ejecución de la declaración de prueba (o no, o llamarlo varias veces) y hacer lo que quiera before and after
.
Ahora, JUnit tiene una nueva declaración que hace más que simplemente ejecutar la prueba, y puede volver a pasar eso a más reglas antes de finalmente llamar a Execute.