0
0
JUnittesting~20 mins

@MethodSource for factory methods in JUnit - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
JUnit @MethodSource Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of @MethodSource supplying multiple arguments
Given the following JUnit 5 test code using @MethodSource, what will be the output when the test runs?
JUnit
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

public class CalculatorTest {

    static Stream<org.junit.jupiter.params.provider.Arguments> provideAddData() {
        return Stream.of(
            org.junit.jupiter.params.provider.Arguments.of(1, 2, 3),
            org.junit.jupiter.params.provider.Arguments.of(3, 4, 7),
            org.junit.jupiter.params.provider.Arguments.of(5, 5, 10)
        );
    }

    @ParameterizedTest
    @MethodSource("provideAddData")
    void testAdd(int a, int b, int expected) {
        assertEquals(expected, a + b);
    }
}
ATest fails because provideAddData returns Stream<Object> instead of Stream<Arguments>.
BAll 3 tests pass successfully.
CTest fails due to missing @Test annotation on provideAddData method.
DTest fails because testAdd method parameters do not match the Arguments count.
Attempts:
2 left
💡 Hint
Check the method signature and the parameter types in the test method.
assertion
intermediate
1:30remaining
Correct assertion for @MethodSource test with multiple parameters
Which assertion correctly verifies the output of a method that adds two integers, when using @MethodSource to supply test data?
JUnit
static Stream<org.junit.jupiter.params.provider.Arguments> data() {
    return Stream.of(
        org.junit.jupiter.params.provider.Arguments.of(2, 3, 5),
        org.junit.jupiter.params.provider.Arguments.of(4, 5, 9)
    );
}

@ParameterizedTest
@MethodSource("data")
void testSum(int x, int y, int expected) {
    // Which assertion is correct here?
}
AassertFalse(x + y != expected);
BassertTrue(x + y == expected);
CassertEquals(x + y, expected);
DassertEquals(expected, x + y);
Attempts:
2 left
💡 Hint
Remember the order of parameters in assertEquals(expected, actual).
🔧 Debug
advanced
2:00remaining
Identify the cause of NoSuchMethodException in @MethodSource
A test using @MethodSource("testData") fails with NoSuchMethodException. What is the most likely cause?
JUnit
public class SampleTest {

    @ParameterizedTest
    @MethodSource("testData")
    void testExample(int input) {
        // test code
    }

    static Stream<Integer> testdata() {
        return Stream.of(1, 2, 3);
    }
}
AMethod name in @MethodSource is case-sensitive and does not match the actual method name.
BThe testdata method is not static.
CThe testdata method returns Stream<Integer> instead of Stream<Arguments>.
DThe testExample method has wrong parameter type.
Attempts:
2 left
💡 Hint
Check spelling and capitalization of the method name in @MethodSource.
framework
advanced
2:00remaining
Behavior of @MethodSource with non-static factory method
What happens if a @MethodSource factory method is non-static in a JUnit 5 test class?
JUnit
public class DemoTest {

    @ParameterizedTest
    @MethodSource("dataProvider")
    void test(int val) {
        // test code
    }

    Stream<Integer> dataProvider() {
        return Stream.of(10, 20);
    }
}
ATest runs successfully because non-static factory methods are allowed by default.
BTest fails because the factory method returns Stream<Integer> instead of Stream<Arguments>.
CTest fails with an exception because @MethodSource factory methods must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
DTest runs but only the first parameter value is used.
Attempts:
2 left
💡 Hint
Consider the lifecycle of the test class and how JUnit accesses factory methods.
🧠 Conceptual
expert
2:30remaining
Understanding parameter matching in @MethodSource with Arguments
Consider a @MethodSource factory method returning Stream with three parameters per Arguments. The test method has two parameters. What will happen when the test runs?
JUnit
static Stream<org.junit.jupiter.params.provider.Arguments> provideData() {
    return Stream.of(
        org.junit.jupiter.params.provider.Arguments.of(1, 2, 3),
        org.junit.jupiter.params.provider.Arguments.of(4, 5, 9)
    );
}

@ParameterizedTest
@MethodSource("provideData")
void testSum(int a, int b) {
    // test code
}
ATest fails with ParameterResolutionException due to parameter count mismatch.
BTest runs using only the first two parameters from Arguments, ignoring the third.
CTest runs but throws ArrayIndexOutOfBoundsException at runtime.
DTest runs successfully because extra parameters in Arguments are ignored.
Attempts:
2 left
💡 Hint
Check if the number of parameters in the test method matches the number of arguments supplied.