Что эквивалентно @RuleChain в JUnit 5? - PullRequest
0 голосов
/ 04 октября 2018
  • У меня есть 2 правила "уровня класса": MyRule1 и MyRule2
  • MyRule2 зависит от MyRule1
  • MyRule1 метод "до" долженпоэтому выполняйте перед методом MyRule2 "before".

В 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Выполнение.

Я просмотрел документацию Model Extension JUnit 5 , но не нашел ничего о расширениях, которые зависят от других расширений.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Для расширений, зарегистрированных через @RegisterExtension, в настоящее время (по состоянию на JUnit Jupiter 5.3.1) нет встроенной поддержки, аналогичной JUnit 4 RuleChain.

Однако эта проблема ссылается на пользовательское решение, а также предлагает поддержку @Order для контроля порядка выполнения расширений.

0 голосов
/ 04 октября 2018

Цитировать Документация Юпитера :

Расширения, зарегистрированные декларативно через @ExtendWith, будут выполняться в том порядке, в котором они объявлены в исходном коде.

Итак, в вашем случае вы должны просто объявить их в следующем порядке:

@ExtendsWith({Rule1.class, Rule2.class})
public class MyTest {
...