MyRule1
and MyRule2
MyRule2
depends on MyRule1
MyRule1
"before" method should therefore run before the MyRule2
"before" method.In JUnit 4, it can be implemented this way, via the RuleChain :
static MyRule1 myRule1 = new MyRule1();
static MyRule2 myRule2 = new MyRule2(myRule1);
@Rule
TestRule ruleChain = RuleChain.outerRule(myRule1)
.around(myRule2);
In JUnit 5, I have to implement it this way :
static MyRule1 myRule1 = new MyRule1();
@RegisterExtension
static MyRule2 myRule2 = new MyRule2(myRule1);
with 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
}
}
It's the equivalent of the JUnit 4 implementation when it comes to the result.
But I have to explicitly and manually call the beforeAll()
callback of MyRule1
in MyRule2
.
I would like that MyRule2
would not be responsible for MyRule1
execution.
I went through the Extension Model documentation of JUnit 5 but didn't find anything on extensions that depend on other extensions.
It's important, however, to understand that the two terms are not the same. JUnit Jupiter is the API for writing tests using JUnit version 5. JUnit 5 is the project name (and version) that includes the separation of concerns reflected in all three major modules: JUnit Jupiter, JUnit Platform, and JUnit Vintage.
Only one test runner can execute tests at a time in JUnit 4 (e.g. SpringJUnit4ClassRunner or Parameterized ). JUnit 5 allows multiple runners to work simultaneously. JUnit 4 never advanced beyond Java 7, missing out on a lot of features from Java 8. JUnit 5 makes good use of the Java 8 features.
@Retention(value=RUNTIME) @Target(value={FIELD,METHOD}) public @interface Rule. Annotates fields that reference rules or methods that return a rule. A field must be public, not static, and a subtype of TestRule (preferred) or MethodRule .
To quote Jupiter's documentation:
Extensions registered declaratively via
@ExtendWith
will be executed in the order in which they are declared in the source code.
So, in your case, you should just declare them in that order:
@ExtendsWith({Rule1.class, Rule2.class})
public class MyTest {
For extensions registered via @RegisterExtension
, there is currently (as of JUnit Jupiter 5.3.1) no built-in support analogous to JUnit 4's RuleChain
.
However, this issue links to a custom solution and also proposes support for @Order
to control the order in which extensions are executed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With