Close

JUnit 5 - JUnit Suite Configuration Reuse via Interface

[Last Updated: Dec 21, 2025]

Just like super classJUnit 5 allows using @Suite and other configuration annotation on an interface. For example alone with @Suite we can use @SelectPackages on the interface.
Classes implementing this interface inherit the suite configuration and can add additional filters such as @IncludeTags.

Example

Tests

package com.logicbig.example;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;

@Tag("integration")
public class IntegrationTest {

    @Test
    void integrationTestMethod() {
        assertTrue(true);
    }
}
package com.logicbig.example;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;

@Tag("staging")
public class StagingTest {

    @Test
    void stagingTestMethod() {
        assertTrue(true);
    }
}

Suite Interface

package com.logicbig.example;

import org.junit.platform.suite.api.IncludeTags;

@IncludeTags("integration")
public class InterfaceSuiteTest implements BaseSuiteInterface {
    // Inherits package selection from BaseSuiteInterface and adds tag filter
}

Implementing the interface

package com.logicbig.example;

import org.junit.platform.suite.api.IncludeTags;

@IncludeTags("integration")
public class InterfaceSuiteTest implements BaseSuiteInterface {
    // Inherits package selection from BaseSuiteInterface and adds tag filter
}

Output

$ mvn test -Dtest=InterfaceSuiteTest
[INFO] Scanning for projects...
[INFO]
[INFO] -----< com.logicbig.example:junit-5-interface-suite-configuration >-----
[INFO] Building junit-5-interface-suite-configuration 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ junit-5-interface-suite-configuration ---
[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-suite-engine\junit-5-interface-suite-configuration\src\main\resources
[INFO]
[INFO] --- compiler:3.11.0:compile (default-compile) @ junit-5-interface-suite-configuration ---
[INFO] No sources to compile
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ junit-5-interface-suite-configuration ---
[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-suite-engine\junit-5-interface-suite-configuration\src\test\resources
[INFO]
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ junit-5-interface-suite-configuration ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- surefire:3.5.0:test (default-test) @ junit-5-interface-suite-configuration ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] +--InterfaceSuiteTest IntegrationTest - 0.057 ss
[INFO] | '-- [OK] integrationTestMethod - 0.050 ss
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.160 s
[INFO] Finished at: 2025-12-21T09:42:29+08:00
[INFO] ------------------------------------------------------------------------

The interface BaseSuiteInterface defines the package selection via @SelectPackages("com.logicbig.example"). The implementing class InterfaceSuiteTest adds @IncludeTags("integration") to filter tests. Only tests in the selected package with the tag 'integration' are executed.

This pattern allows you to maintain reusable suite configuration in an interface and selectively customize filters in multiple implementing classes.

Example Project

Dependencies and Technologies Used:

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

    Version compatibilities of junit-jupiter-engine with this example:

    • 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.

  • junit-platform-suite-engine 6.0.1 (Module "junit-platform-suite-engine" of JUnit)
  • JDK 25
  • Maven 3.9.11

JUnit 5 - Reuse Suite Configuration via Interface Select All Download
  • junit-5-interface-suite-configuration
    • src
      • test
        • java
          • com
            • logicbig
              • example
                • InterfaceSuiteTest.java

    See Also