¿Cómo funciona Junit @Rule?
Quiero escribir casos de prueba para una gran cantidad de código, me gustaría conocer los detalles de @Rule
la función de anotación JUnit, para poder usarla para escribir casos de prueba. Proporcione algunas buenas respuestas o enlaces que brinden una descripción detallada de su funcionalidad a través de un ejemplo simple.
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
. El uso de ExternalResource
en lugar 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 la wiki de JUnit: Reglas .
Las reglas de Junit funcionan según el principio de AOP (programación orientada a aspectos). Intercepta el método de prueba, brindando así 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 como 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 Declaración para que Execute()
ejecute su prueba. Luego, en lugar de llamar statement.Execute()
directamente para ejecutar la prueba, JUnit pasa la Declaración a una TestRule con la @Rule
anotación. La función "aplicar" de TestRule devuelve una nueva Declaración dada la Declaración con su prueba. El método de la nueva Declaración Execute()
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 solo ejecutar la prueba, y puede pasarla nuevamente a más reglas antes de finalmente llamar a Ejecutar.
Las reglas se utilizan para mejorar el comportamiento de cada método de prueba de forma genérica. La regla Junit intercepta el método de prueba y nos permite hacer algo antes de que un método de prueba comience a ejecutarse y después de que se haya ejecutado un método de prueba.
Por ejemplo, usando la regla @Timeout podemos establecer el tiempo de espera para todas las pruebas.
public class TestApp {
@Rule
public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);
......
......
}
La regla @TemporaryFolder se utiliza para crear carpetas y archivos temporales. Cada vez que se ejecuta el método de prueba, se crea una carpeta temporal y se elimina después de la ejecución del método.
public class TempFolderTest {
@Rule
public TemporaryFolder tempFolder= new TemporaryFolder();
@Test
public void testTempFolder() throws IOException {
File folder = tempFolder.newFolder("demos");
File file = tempFolder.newFile("Hello.txt");
assertEquals(folder.getName(), "demos");
assertEquals(file.getName(), "Hello.txt");
}
}
Puede ver ejemplos de algunas reglas integradas proporcionadas por junit en este enlace .