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

dced5bon  于 2022-12-25  发布在  Java
关注(0)|答案(3)|浏览(192)
  • 我有两条"班级级别"规则: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的执行负责。
我浏览了JUnit5的扩展模型文档,但没有找到任何关于依赖于其他扩展的扩展的内容。

o2g1uqev

o2g1uqev1#

引用朱庇特的文献:
通过@ExtendWith声明注册的扩展将按照它们在源代码中声明的顺序执行。
因此,在您的情况下,您只需按以下顺序声明它们:

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

lqfhib0f2#

对于通过@RegisterExtension注册的扩展,目前(截至JUnit Jupiter 5.3.1)没有类似于JUnit 4的RuleChain的内置支持。
但是,this issue链接到一个定制解决方案,并且还建议支持@Order来控制扩展的执行顺序。

xwmevbvl

xwmevbvl3#

对于通过@RegisterExtension注册的扩展,一些库如testy-box提供了对链式扩展的支持。

相关问题