Что эквивалентно @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, обеспечивают поддержку расширений в цепочке.

Другие вопросы по тегам