Close

JUnit 5 - @ParameterizedTest with @MethodSource

[Last Updated: Dec 5, 2025]

@MethodSource references a factory method that returns arguments for a @ParameterizedTest.

Java source and doc

Definition of MethodSource

(Version: junit-5 6.0.1)
package org.junit.jupiter.params.provider;
   ........
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Repeatable(MethodSources.class)
@API(status = STABLE, since = "5.7")
@ArgumentsSource(MethodArgumentsProvider.class)
@SuppressWarnings("exports")
public @interface MethodSource {
    String[] value() default ""; 1
}
1 The names of factory methods within the test class or in external classes to use as sources for arguments.

Factory methods in external classes must be referenced by fully qualified method name — for example, "com.example.StringsProviders#blankStrings" or "com.example.TopLevelClass$NestedClass#classMethod" for a factory method in a static nested class.

If a factory method accepts arguments that are provided by a org.junit.jupiter.api.extension.ParameterResolver ParameterResolver, you can supply the formal parameter list in the qualified method name to disambiguate between overloaded variants of the factory method. For example, "blankStrings(int)" for a local qualified method name or "com.example.StringsProviders#blankStrings(int)" for a fully qualified method name.

If no factory method names are declared, a method within the test class that has the same name as the test method will be used as the factory method by default in case this annotation is applied to a @ParameterizedTest method. For a @ParameterizedClass, at least one method name must be declared explicitly.

For further information, see the MethodSource class-level Javadoc.

Example

package com.logicbig.example;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class ParameterizedMethodSourceTest {

    static Stream<String> palindromes() {
        return Stream.of("madam", "racecar", "level");
    }

    @ParameterizedTest
    @MethodSource("additionProvider")
    void testAddition(int a, int b, int expected) {
        assertEquals(expected, a + b);
    }

    @ParameterizedTest(name = "#{index} method source arg={0}")
    @MethodSource("palindromes")
    void isPalindromeFromMethodSource(String input) {
        assertTrue(new StringBuilder(input).reverse().toString().equals(input));
    }
    // Factory method must be static
    private static Stream<Arguments> additionProvider() {
        return Stream.of(
                Arguments.of(1, 2, 3),
                Arguments.of(0, 0, 0),
                Arguments.of(-5, 5, 0),
                Arguments.of(100, 200, 300)
        );
    }
}
mvn test -Dtest=ParameterizedMethodSourceTest

Output

D:\example-projects\junit-5\junit-5-parameterized-tests\junit-5-parameterized-methodsource>mvn test -Dtest=ParameterizedMethodSourceTest
[INFO] Scanning for projects...
[INFO]
[INFO] -------< com.logicbig.example:junit-5-parameterized-methodsource >-------
[INFO] Building junit-5-parameterized-methodsource 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ junit-5-parameterized-methodsource ---
[INFO] skip non existing resourceDirectory D:\example-projects\junit-5\junit-5-enabling-disabling-tests\junit-5-parameterized-tests\junit-5-parameterized-methodsource\src\main\resources
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ junit-5-parameterized-methodsource ---
[INFO] No sources to compile
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ junit-5-parameterized-methodsource ---
[INFO] skip non existing resourceDirectory D:\example-projects\junit-5\junit-5-enabling-disabling-tests\junit-5-parameterized-tests\junit-5-parameterized-methodsource\src\test\resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ junit-5-parameterized-methodsource ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- surefire:3.5.0:test (default-test) @ junit-5-parameterized-methodsource ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] +--com.logicbig.example.ParameterizedMethodSourceTest - 0.276 ss
[INFO] | +-- [OK] testAddition(int, int, int)[1] 1, 2, 3 - 0.073 ss
[INFO] | +-- [OK] testAddition(int, int, int)[2] 0, 0, 0 - 0.003 ss
[INFO] | +-- [OK] testAddition(int, int, int)[3] -5, 5, 0 - 0.002 ss
[INFO] | +-- [OK] testAddition(int, int, int)[4] 100, 200, 300 - 0.005 ss
[INFO] | +-- [OK] isPalindromeFromMethodSource(String) #1 method source arg="madam" - 0.008 ss
[INFO] | +-- [OK] isPalindromeFromMethodSource(String) #2 method source arg="racecar" - 0.001 ss
[INFO] | '-- [OK] isPalindromeFromMethodSource(String) #3 method source arg="level" - 0.003 ss
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.710 s
[INFO] Finished at: 2025-12-04T14:06:10+08:00
[INFO] ------------------------------------------------------------------------

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.

  • junit-jupiter-params 6.0.1 (Module "junit-jupiter-params" of JUnit)
  • JDK 25
  • Maven 3.9.11

JUnit 5 - Parameterized MethodSource Select All Download
  • junit-5-parameterized-methodsource
    • src
      • test
        • java
          • com
            • logicbig
              • example
                • ParameterizedMethodSourceTest.java

    See Also