JUnit 5 中的@RuleChain 等价物是什么?

What is the equivalent of @RuleChain in JUnit 5?

在 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 实现。

但我必须在MyRule2.

中显式地手动调用MyRule1beforeAll()回调

我希望 MyRule2 不负责 MyRule1 执行。

我经历了 Extension Model documentation of JUnit 5 但没有在依赖于其他扩展的扩展上找到任何内容。

引用Jupiter's documentation:

Extensions registered declaratively via @ExtendWith will be executed in the order in which they are declared in the source code.

因此,在您的情况下,您应该按顺序声明它们:

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

对于通过 @RegisterExtension 注册的扩展,目前(从 JUnit Jupiter 5.3.1 开始)没有类似于 JUnit 4 的内置支持 RuleChain

但是,this issue 链接到自定义解决方案,还提议支持 @Order 以控制扩展的执行顺序。