8
  • 我有 2 个“班级级别”规则:MyRule1MyRule2
  • MyRule2取决于MyRule1
  • MyRule1因此,“之前”方法应该在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 的实现。

但我必须显式手动调用in的beforeAll()回调。MyRule1MyRule2

我想那MyRule2将不负责MyRule1执行。

我浏览了JUnit 5 的扩展模型文档, 但没有找到任何依赖于其他扩展的扩展。

4

2 回答 2

2

引用木星的文档

以声明方式注册的扩展@ExtendWith将按照它们在源代码中声明的顺序执行。

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

@ExtendsWith({Rule1.class, Rule2.class})
public class MyTest {
于 2018-10-04T14:00:43.300 回答
1

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

但是,此问题链接到自定义解决方案,并且还建议支持@Order控制扩展执行的顺序。

于 2018-10-26T12:01:51.880 回答