Ответ 1
Причина проста, TestRule
планировалось заменить MethodRule
. MethodRule
был введен в 4.7, и это интерфейс с одним методом:
Statement apply(Statement base, FrameworkMethod method, Object target)
FrameworkMethod
является (почти) внутренним классом JUnit, который не должен был быть раскрыт в первую очередь. object
- это объект, на котором будет запущен метод, например, вы можете изменить состояние теста с помощью отражения.
TestRule
было введено в 4.9, однако:
Statement apply(Statement base, Description description)
Description
является неизменным POJO, содержащим описание теста. Способ изменения состояния в рамках теста состоит в том, чтобы правильно инкапсулировать внутри теста с помощью TestRule
. Это совсем чистый дизайн.
Конкретная разница между TestWatchman(MethodRule)
и TestWatcher(TestRule)
минимальна, за исключением того, что TestWatcher имеет лучшую обработку ошибок, поэтому это должно использоваться в предпочтении. У обоих есть сложные методы, такие как succeeded()
, failed()
, starting()
, finished()
.
public static class WatchmanTest {
private static String watchedLog;
@Rule
public TestWatcher watchman= new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
watchedLog+= description + "\n";
}
@Override
protected void succeeded(Description description) {
watchedLog+= description + " " + "success!\n";
}
};
@Test
public void fails() {
fail();
}
@Test
public void succeeds() {
}
}
TestWatcher(TestRule)
обрабатывает исключения в переопределенных методах. Если выбрасываются исключения, тогда метод тестирования выходит из строя после выполнения теста, а не во время.
Для получения дополнительной информации см. TestWatcher и TestWatchman