junit
Regole di test personalizzate
Ricerca…
Osservazioni
Ci sono benefici per entrambi. Estendere ExternalResource
è comodo, soprattutto se abbiamo solo bisogno di un before()
per impostare qualcosa.
Tuttavia, dovremmo essere consapevoli del fatto che, poiché il metodo before()
viene eseguito al di fuori del try...finally
, try...finally
, qualsiasi codice richiesto per eseguire clean-in after()
non verrà eseguito se c'è un errore durante il esecuzione di before()
.
Ecco come appare in ExternalResource
:
before();
try {
base.evaluate();
} finally {
after();
}
Ovviamente, se qualche eccezione è lanciata nel test stesso, o da un'altra regola nidificata, il dopo verrà comunque eseguito.
Custom @TestRule per implementazione
Questo è particolarmente utile se abbiamo una classe che vogliamo estendere nella regola. Vedi l'esempio sotto per un metodo più conveniente.
import org.junit.rules.TestRule; import org.junit.runners.model.Statement; public class AwesomeTestRule implements TextRule { @Override public Statement apply(Statement base, Description description) { return new AwesomeStatement(base); } private static class AwesomeStatement extends Statement { private Statement base; public AwesomeStatement(Statement base) { this.base = base; } @Override public void evaluate() throws Throwable { try { // do your magic base.evaluate(); // this will call Junit to run an individual test } finally { // undo the magic, if required } } } }
Custom @TestRule per estensione
JUnit ha un'implementazione astratta di @TestRule
che ti permette di scrivere una regola in un modo più semplice. Si chiama ExternalResource
e fornisce due metodi protetti che possono essere estesi in questo modo:
public class AwesomeTestRule extends ExternalResource { @Override protected void before() { // do your magic } @Override protected void after() { // undo your magic, if needed } }