JUnit 5 中的@RuleChain 等价物是什么?
What is the equivalent of @RuleChain in JUnit 5?
- 我有 2 个 "class level" 规则:
MyRule1
和 MyRule2
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
.
中显式地手动调用MyRule1
的beforeAll()
回调
我希望 MyRule2
不负责 MyRule1
执行。
我经历了 Extension Model documentation of JUnit 5
但没有在依赖于其他扩展的扩展上找到任何内容。
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
以控制扩展的执行顺序。
- 我有 2 个 "class level" 规则:
MyRule1
和MyRule2
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
.
MyRule1
的beforeAll()
回调
我希望 MyRule2
不负责 MyRule1
执行。
我经历了 Extension Model documentation of JUnit 5 但没有在依赖于其他扩展的扩展上找到任何内容。
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
以控制扩展的执行顺序。