- 我有两条"班级级别"规则:
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
的执行负责。
我浏览了JUnit5的扩展模型文档,但没有找到任何关于依赖于其他扩展的扩展的内容。
3条答案
按热度按时间o2g1uqev1#
引用朱庇特的文献:
通过
@ExtendWith
声明注册的扩展将按照它们在源代码中声明的顺序执行。因此,在您的情况下,您只需按以下顺序声明它们:
lqfhib0f2#
对于通过
@RegisterExtension
注册的扩展,目前(截至JUnit Jupiter 5.3.1)没有类似于JUnit 4的RuleChain
的内置支持。但是,this issue链接到一个定制解决方案,并且还建议支持
@Order
来控制扩展的执行顺序。xwmevbvl3#
对于通过@RegisterExtension注册的扩展,一些库如testy-box提供了对链式扩展的支持。