Close

JUnit 5 - ExecutionCondition Extension

[Last Updated: Jan 1, 2026]

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 ExecutionCondition

Version: 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
 }
1Evaluate this condition for the supplied ExtensionContext.

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 Project

Dependencies and Technologies Used:

  • junit-jupiter-engine 6.0.1 (Module "junit-jupiter-engine" of JUnit)
     Version Compatibility: 5.0.0 - 6.0.1Version List
    ×

    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

JUnit 5 - ExecutionCondition Select All Download
  • junit-5-execution-condition-example
    • src
      • test
        • java
          • com
            • logicbig
              • example
                • ExecutionConditionTest.java

    See Also