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
    }

}



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow