0
0
JUnittesting~20 mins

Argument aggregation in JUnit - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Argument Aggregation Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of JUnit test with argument aggregation
Consider the following JUnit 5 test using @CsvSource and argument aggregation. What will be the output when the test runs?
JUnit
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.aggregator.AggregateWith;
import static org.junit.jupiter.api.Assertions.*;

class User {
    String name;
    int age;
    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class UserAggregator implements org.junit.jupiter.params.aggregator.ArgumentsAggregator {
    @Override
    public User aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor accessor, java.lang.reflect.Parameter parameter) {
        return new User(accessor.getString(0), accessor.getInteger(1));
    }
}

public class UserTest {
    @ParameterizedTest
    @CsvSource({"Alice,30", "Bob,25"})
    void testUser(@AggregateWith(UserAggregator.class) User user) {
        assertNotNull(user.name);
        assertTrue(user.age > 20);
    }
}
ATest passes for both Alice and Bob
BTest fails for Alice because age is not > 20
CTest fails for Bob because name is null
DTest throws a runtime exception due to aggregator error
Attempts:
2 left
💡 Hint
Think about how the aggregator converts CSV input into User objects and what the assertions check.
assertion
intermediate
2:00remaining
Identify failing assertion in argument aggregation test
Given a parameterized test using argument aggregation, which assertion will fail if the aggregator incorrectly maps parameters?
JUnit
import static org.junit.jupiter.api.Assertions.*;

class Product {
    String id;
    double price;
    Product(String id, double price) {
        this.id = id;
        this.price = price;
    }
}

// Aggregator maps first param to price, second to id (incorrect)
class ProductAggregator implements org.junit.jupiter.params.aggregator.ArgumentsAggregator {
    @Override
    public Product aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor accessor, java.lang.reflect.Parameter parameter) {
        return new Product(accessor.getString(1), accessor.getDouble(0));
    }
}

@org.junit.jupiter.params.ParameterizedTest
@org.junit.jupiter.params.provider.CsvSource({"19.99, P123", "5.50, P456"})
void testProduct(@org.junit.jupiter.params.aggregator.AggregateWith(ProductAggregator.class) Product product) {
    assertNotNull(product.id);
    assertTrue(product.price > 0);
}
AassertNotNull(product.id) fails
BassertTrue(product.price > 0) fails
CTest throws NullPointerException
DBoth assertions pass
Attempts:
2 left
💡 Hint
Check how the aggregator swaps parameters and what values are passed.
🔧 Debug
advanced
2:00remaining
Debug failing argument aggregation test due to missing parameter
A parameterized test using argument aggregation fails with an IndexOutOfBoundsException. What is the most likely cause?
JUnit
import static org.junit.jupiter.api.Assertions.*;

@org.junit.jupiter.params.ParameterizedTest
@org.junit.jupiter.params.provider.CsvSource({"John", "Jane, 28"})
void testPerson(@org.junit.jupiter.params.aggregator.AggregateWith(PersonAggregator.class) Person person) {
    assertNotNull(person.name);
    assertTrue(person.age > 0);
}

class Person {
    String name;
    int age;
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class PersonAggregator implements org.junit.jupiter.params.aggregator.ArgumentsAggregator {
    @Override
    public Person aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor accessor, java.lang.reflect.Parameter parameter) {
        return new Person(accessor.getString(0), accessor.getInteger(1));
    }
}
AThe first CSV line has missing age parameter causing IndexOutOfBoundsException
BPersonAggregator class is not public causing reflection failure
CThe test method is missing @Test annotation
DPerson constructor parameters are in wrong order
Attempts:
2 left
💡 Hint
Look at the CSV input lines and how many parameters each has.
framework
advanced
2:00remaining
Best practice for argument aggregation in JUnit 5
Which practice is recommended when implementing a custom ArgumentsAggregator in JUnit 5?
AThrow RuntimeException inside aggregateArguments to fail tests on invalid input
BUse instance variables in the aggregator to store state between test runs
CMake the aggregator class a static nested class or top-level class to avoid reflection issues
DUse @BeforeEach to initialize aggregator fields before each aggregation
Attempts:
2 left
💡 Hint
Think about how JUnit uses reflection to instantiate aggregators.
🧠 Conceptual
expert
3:00remaining
Understanding argument aggregation behavior with nested objects
In JUnit 5, when using argument aggregation to create a complex object with nested objects, which statement is true?
AJUnit automatically aggregates nested objects if their aggregators are registered globally
BYou must manually aggregate nested objects inside the main aggregator; JUnit does not recursively aggregate nested parameters
CNested objects cannot be used with argument aggregation and require separate parameterized tests
DJUnit uses reflection to automatically instantiate nested objects without custom aggregators
Attempts:
2 left
💡 Hint
Consider how argument aggregation works with complex parameter types.