【问题标题】:What is the equivalent of @RuleChain in JUnit 5?JUnit 5 中的 @RuleChain 等价物是什么?
【发布时间】:2019-03-09 20:39:40
【问题描述】:
  • 我有 2 个“班级级别”规则:MyRule1MyRule2
  • MyRule2 取决于 MyRule1
  • 因此,MyRule1“before”方法应该在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 的实现。

但我必须在MyRule2 中显式手动调用MyRule1beforeAll() 回调。

我希望MyRule2 不对MyRule1 的执行负责。

我通过Extension Model documentation of JUnit 5 但没有找到任何依赖于其他扩展的扩展。

【问题讨论】:

    标签: java junit junit5 junit5-extension-model


    【解决方案1】:

    引用Jupiter's documentation

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

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

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

    【讨论】:

    • 抱歉,我没有说明我需要访问 MyRule1 才能在 MyRule2 中执行某些操作。我更新了我的问题。但是,如果我按照您的建议进行操作,JUnit5 会将 Rule1 注入 Rule 2 吗?我对此表示怀疑。
    • 我也很想知道这个问题的答案,因为我们也有类似的情况,其中一些规则依赖于其他规则。 (最常见的是 TempFolder。)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2019-02-04
      • 2014-07-26
      • 1970-01-01
      • 2015-02-24
      • 2014-05-08
      • 1970-01-01
      相关资源
      最近更新 更多