junit
Пользовательские тестовые правила
Поиск…
замечания
Есть льготы для обоих. Расширение ExternalResource
это удобно, особенно если нам требуется только before()
чтобы установить что-то.
Тем не менее, мы должны знать, что, поскольку метод before()
выполняется за пределами try...finally
, любой код, который требуется очистить after()
, не будет выполнен, если есть ошибка во время выполнение before()
.
Вот как он выглядит внутри ExternalResource
:
before();
try {
base.evaluate();
} finally {
after();
}
Очевидно, что если какое-либо исключение выбрано в самом тесте или другом вложенном правиле, то после этого все равно будет выполнено.
Пользовательский @TestRule по реализации
Это особенно полезно, если у нас есть класс, который мы хотим расширить в правиле. См. Пример ниже для более удобного метода.
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 } } } }
Пользовательский @TestRule по расширению
JUnit имеет абстрактную реализацию @TestRule
которая позволяет вам писать правило более простым способом. Это называется ExternalResource
и предоставляет два защищенных метода, которые могут быть расширены следующим образом:
public class AwesomeTestRule extends ExternalResource { @Override protected void before() { // do your magic } @Override protected void after() { // undo your magic, if needed } }