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
}
}