The ExecutionCondition interface defines the API for extensions that wish to provide a condition to determine whether a test or container should be executed.
Java source and doc
Definition of ExecutionConditionVersion: 6.0.1 package org.junit.jupiter.api.extension;
@FunctionalInterface
@API(status = STABLE, since = "5.0")
public interface ExecutionCondition extends Extension {
ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context); 1
}
Example
Implementing ExecutionCondition
We are going to disable all repeated tests in this example.
package com.logicbig.example;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
import org.junit.jupiter.api.extension.ExecutionCondition;
import org.junit.jupiter.api.extension.ExtensionContext;
public class IgnoreTestCondition implements ExecutionCondition {
@Override
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
RepeatedTest repeatedTest = context.getElement().get().getAnnotation(RepeatedTest.class);
if (repeatedTest != null) {
return ConditionEvaluationResult.disabled("Repeated tests are disabled");
}else{
return ConditionEvaluationResult.enabled("All other tests are allowed");
}
}
}
Test Class
package com.logicbig.example;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(IgnoreTestCondition.class)
public class ExecutionConditionTest {
@Test
void myTest() {
System.out.println("Test executed");
}
@RepeatedTest(5)
void myRepeatTest() {
System.out.println("Repeated Test executed");
}
}
Output$ mvn test -Dtest=ExecutionConditionTest [INFO] Scanning for projects... [INFO] [INFO] ------< com.logicbig.example:junit-5-execution-condition-example >------ [INFO] Building junit-5-execution-condition-example 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- resources:3.3.1:resources (default-resources) @ junit-5-execution-condition-example --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\example-projects\junit-5\junit-5-extensions\junit-5-execution-condition-example\src\main\resources [INFO] [INFO] --- compiler:3.13.0:compile (default-compile) @ junit-5-execution-condition-example --- [INFO] No sources to compile [INFO] [INFO] --- resources:3.3.1:testResources (default-testResources) @ junit-5-execution-condition-example --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\example-projects\junit-5\junit-5-extensions\junit-5-execution-condition-example\src\test\resources [INFO] [INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ junit-5-execution-condition-example --- [INFO] Recompiling the module because of changed source code. [WARNING] File encoding has not been set, using platform encoding windows-1252, i.e. build is platform dependent! [INFO] Compiling 2 source files with javac [debug target 17] to target\test-classes [INFO] [INFO] --- surefire:3.5.0:test (default-test) @ junit-5-execution-condition-example --- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- Test executed [INFO] +--com.logicbig.example.ExecutionConditionTest - 0.116 ss [INFO] | +-- [OK] myTest - 0.050 ss [INFO] | '-- [??] myRepeatTest (Repeated tests are disabled) - 0 ss [INFO] [INFO] Results: [INFO] [WARNING] Tests run: 2, Failures: 0, Errors: 0, Skipped: 1 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.912 s [INFO] Finished at: 2025-12-30T15:48:04+08:00 [INFO] ------------------------------------------------------------------------
The output demonstrates that the custom ExecutionCondition was successfully evaluated by the JUnit engine. By returning a 'Disabled' ConditionEvaluationResult based on our custom logic, the repeated test execution was skipped, showcasing how this extension point allows for dynamic, runtime control over which tests are actually performed.
Example ProjectDependencies and Technologies Used: - junit-jupiter-engine 6.0.1 (Module "junit-jupiter-engine" of JUnit)
Version Compatibility: 5.0.0 - 6.0.1 Version compatibilities of junit-jupiter-engine with this example:
- 5.0.0
- 5.0.1
- 5.0.2
- 5.0.3
- 5.1.0
- 5.1.1
- 5.2.0
- 5.3.0
- 5.3.1
- 5.3.2
- 5.4.0
- 5.4.1
- 5.4.2
- 5.5.0
- 5.5.1
- 5.5.2
- 5.6.0
- 5.6.1
- 5.6.2
- 5.6.3
- 5.7.0
- 5.7.1
- 5.7.2
- 5.8.0
- 5.8.1
- 5.8.2
- 5.9.0
- 5.9.1
- 5.9.2
- 5.9.3
- 5.10.0
- 5.10.1
- 5.10.2
- 5.10.3
- 5.10.4
- 5.10.5
- 5.11.0
- 5.11.1
- 5.11.2
- 5.11.3
- 5.11.4
- 5.12.0
- 5.12.1
- 5.12.2
- 5.13.0
- 5.13.1
- 5.13.2
- 5.13.3
- 5.13.4
- 5.14.0
- 5.14.1
- 6.0.0
- 6.0.1
Versions in green have been tested.
- JDK 25
- Maven 3.9.11
|