Что эквивалентно @RuleChain в JUnit 5?
- У меня есть 2 правила "уровня класса":
MyRule1
а такжеMyRule2
MyRule2
зависит отMyRule1
MyRule1
Поэтому метод "before" должен выполняться доMyRule2
метод "до".
В JUnit 4 это может быть реализовано следующим образом через RuleChain:
static MyRule1 myRule1 = new MyRule1();
static MyRule2 myRule2 = new MyRule2(myRule1);
@Rule
TestRule ruleChain = RuleChain.outerRule(myRule1)
.around(myRule2);
В JUnit 5 я должен реализовать это следующим образом:
static MyRule1 myRule1 = new MyRule1();
@RegisterExtension
static MyRule2 myRule2 = new MyRule2(myRule1);
с MyRule2
:
class MyRule2 implements BeforeAllCallback {
private final MyRule1 myRule1;
public MyRule2(MyRule1 myRule1) {
this.myRule1 = myRule1;
}
@Override
public void beforeAll(ExtensionContext extensionContext) {
this.myRule1.beforeAll();
X x = this.myRule1.getX();
// do Rule 2 stuff with x
}
}
Это эквивалентно реализации JUnit 4, когда дело доходит до результата.
Но я должен явно и вручную вызвать beforeAll()
обратный вызов MyRule1
в MyRule2
,
Я бы этого хотел MyRule2
не будет нести ответственность за MyRule1
выполнение.
Я просмотрел документацию по Extension Model JUnit 5, но не нашел ничего о расширениях, которые зависят от других расширений.
3 ответа
Для расширений, зарегистрированных через @RegisterExtension
в настоящее время (по состоянию на JUnit Jupiter 5.3.1) нет встроенной поддержки, аналогичной JUnit 4 RuleChain
,
Однако эта проблема связана с пользовательским решением, а также предлагает поддержку для @Order
контролировать порядок выполнения расширений.
Цитировать документацию Юпитера:
Расширения зарегистрированы декларативно через
@ExtendWith
будет выполнен в том порядке, в котором они объявлены в исходном коде.
Итак, в вашем случае вы должны просто объявить их в таком порядке:
@ExtendsWith({Rule1.class, Rule2.class})
public class MyTest {
Для расширений, зарегистрированных через @RegisterExtension, некоторые библиотеки, такие как testy-box, обеспечивают поддержку расширений в цепочке.