Пора рассказать про настоящую мощь Rule, т.е. про класс TestWatcher. С помощью этого класса можно следить за выполнением теста, т.е. начало и конец, статус теста : пройден, провален или пропущен. Мы привыкли использовать аннотации
@Before и @After, т.е. первая аннотация выполняется до теста @Test, а другая после.
Рассмотрим пример :

import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

public class MyRule extends TestWatcher {

	@Override
	protected void starting(Description description) {
		System.out.println("---before()---");
	}

	@Override
	protected void finished(Description description) {
		System.out.println("---after()---");
	}
	
	@Override
    protected void succeeded(Description description) {
		System.out.println("---succeeded()---");
    }

    @Override
    protected void failed(Throwable e, Description description) {
    	System.out.println("---failed()---");
    }

}

Что мы здесь видим : мы создали свой класс MyRule и унаследовались от
TestWatcher. Мы переопределили методы: starting(аналог @Before), finished(аналог @After) и также методы успешного(succeeded) или неуспешного(failed) выполнения теста.
Нам осталось добавить @Rule в наш тестовый класс:

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;

public class TestRule {

	@Rule
	public TestName name = new TestName();

	@Rule
	public MyRule myRule = new MyRule();

	@Test
	public void test1() throws Exception {
		System.out.println(name.getMethodName());
	}

	@Test
	public void test2() throws Exception {
		System.out.println(name.getMethodName());
		assertEquals(1 + 2, 4);
	}

	@Test
	public void test3() throws Exception {
		System.out.println(name.getMethodName());
	}

}

Вывод на консоль:
—before()—
test1
—succeeded()—
—after()—
—before()—
test2
—failed()—
—after()—
—before()—
test3
—succeeded()—
—after()—

Сначала выполниться метод starting(аналог before), потом test1, далее succeeded — т.к. тест пройден без ошибок, далее finished(аналог after).
С методом test2 все аналогично, только вместо succeeded будет failed, т.к. 1 + 2 =3, а не 4.

Реклама