Bird
Raised Fist0
JUnittesting~10 mins

Argument aggregation in JUnit - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create an argument aggregator class that implements ArgumentsAggregator.

JUnit
public class PersonAggregator implements ArgumentsAggregator {
    @Override
    public Person aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) {
        String name = accessor.getString([1]);
        int age = accessor.getInteger(1);
        return new Person(name, age);
    }
}
Drag options to blanks, or click blank then click option'
Aname
B1
C2
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Using 1 instead of 0 for the first argument index.
Using the argument name instead of index.
2fill in blank
medium

Complete the code to use the custom aggregator in a parameterized test.

JUnit
@ParameterizedTest
@CsvSource({"John,25", "Jane,30"})
void testPerson(@AggregateWith(PersonAggregator.class) Person person) {
    assertNotNull([1]);
}
Drag options to blanks, or click blank then click option'
APerson
Bperson.name
Cperson
Dthis.person
Attempts:
3 left
💡 Hint
Common Mistakes
Using the class name 'Person' instead of the parameter.
Trying to access fields without checking the object.
3fill in blank
hard

Fix the error in the aggregator method to correctly retrieve the age argument as an integer.

JUnit
public Person aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) {
    String name = accessor.getString(0);
    int age = accessor.[1](1);
    return new Person(name, age);
}
Drag options to blanks, or click blank then click option'
AgetString
BgetInteger
CgetInt
DgetAge
Attempts:
3 left
💡 Hint
Common Mistakes
Using getString to get an integer value.
Using non-existent methods like getInt or getAge.
4fill in blank
hard

Fill both blanks to create a parameterized test method that uses the aggregator and asserts the person's age.

JUnit
@ParameterizedTest
@CsvSource({"Alice,28"})
void testPersonAge(@AggregateWith(PersonAggregator.class) Person [1]) {
    assertEquals([2], [1].getAge());
}
Drag options to blanks, or click blank then click option'
Aperson
Bage
C28
D35
Attempts:
3 left
💡 Hint
Common Mistakes
Using a different parameter name in the assertion.
Using the wrong age value for the assertion.
5fill in blank
hard

Fill all three blanks to implement an aggregator that combines first and last names into fullName and returns a Person.

JUnit
public class FullNameAggregator implements ArgumentsAggregator {
    @Override
    public Person aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) {
        String firstName = accessor.getString([1]);
        String lastName = accessor.getString([2]);
        String fullName = firstName + " " + lastName;
        int age = accessor.getInteger([3]);
        return new Person(fullName, age);
    }
}
Drag options to blanks, or click blank then click option'
A0
B1
C2
D3
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing up argument indexes.
Using indexes outside the arguments range.

Practice

(1/5)
1. What is the main purpose of using @ArgumentsAggregator in JUnit parameterized tests?
easy
A. To combine multiple method arguments into a single object for easier testing
B. To run tests in parallel threads
C. To generate random test data automatically
D. To skip certain test cases during execution

Solution

  1. Step 1: Understand the role of @ArgumentsAggregator

    This annotation is used to create a custom aggregator that combines multiple input arguments into one object.
  2. Step 2: Recognize the benefit in parameterized tests

    Aggregating arguments simplifies test method signatures and improves readability by passing one object instead of many parameters.
  3. Final Answer:

    To combine multiple method arguments into a single object for easier testing -> Option A
  4. Quick Check:

    @ArgumentsAggregator = combine inputs [OK]
Hint: Remember: Aggregator groups inputs into one object [OK]
Common Mistakes:
  • Confusing @ArgumentsAggregator with parallel test execution
  • Thinking it generates test data automatically
  • Assuming it skips tests
2. Which of the following is the correct way to apply a custom aggregator in a JUnit 5 parameterized test method parameter?
easy
A. @AggregateWith(CustomAggregator.class) MyObject obj
B. @ArgumentsSource(CustomAggregator.class) MyObject obj
C. @AggregateArguments(CustomAggregator.class) MyObject obj
D. @ArgumentAggregator(CustomAggregator.class) MyObject obj

Solution

  1. Step 1: Recall the correct annotation for applying aggregators

    The annotation to apply a custom aggregator on a parameter is @AggregateWith.
  2. Step 2: Match the syntax

    The correct syntax is @AggregateWith(CustomAggregator.class) followed by the parameter type and name.
  3. Final Answer:

    @AggregateWith(CustomAggregator.class) MyObject obj -> Option A
  4. Quick Check:

    @AggregateWith = apply aggregator [OK]
Hint: Use @AggregateWith to link aggregator class to parameter [OK]
Common Mistakes:
  • Using @ArgumentsSource instead of @AggregateWith
  • Misspelling the annotation name
  • Confusing @AggregateWith with @ArgumentAggregator
3. Given the following aggregator implementation and test method, what will be the output of the assertion?
public class PersonAggregator implements ArgumentsAggregator {
  @Override
  public Person aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) {
    return new Person(accessor.getString(0), accessor.getInteger(1));
  }
}

@ParameterizedTest
@CsvSource({"Alice,30", "Bob,25"})
void testPerson(@AggregateWith(PersonAggregator.class) Person person) {
  assertTrue(person.getAge() > 20);
}
medium
A. Test fails for Alice because age is 30
B. Test fails for Bob because age is 25
C. Test passes for both Alice and Bob
D. Test fails for both because age is not checked correctly

Solution

  1. Step 1: Understand the aggregator behavior

    The aggregator creates a Person object with name and age from CSV input.
  2. Step 2: Evaluate the assertion for each input

    Both Alice (30) and Bob (25) have ages greater than 20, so assertTrue(person.getAge() > 20) passes for both.
  3. Final Answer:

    Test passes for both Alice and Bob -> Option C
  4. Quick Check:

    Age > 20 for both inputs = pass [OK]
Hint: Check each input value against assertion condition [OK]
Common Mistakes:
  • Assuming 25 is less than or equal to 20
  • Confusing assertion logic
  • Ignoring aggregator mapping
4. Identify the error in this aggregator implementation:
public class ProductAggregator implements ArgumentsAggregator {
  @Override
  public Product aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) {
    String name = accessor.getString(0);
    int price = accessor.getInteger(1);
    return new Product(name, price);
  }
}

@ParameterizedTest
@CsvSource({"Laptop,1000", "Phone,abc"})
void testProduct(@AggregateWith(ProductAggregator.class) Product product) {
  assertNotNull(product);
}
medium
A. The aggregator method signature is incorrect
B. The Product constructor parameters are in wrong order
C. The @AggregateWith annotation is missing
D. The second CSV input 'Phone,abc' causes a runtime error due to invalid integer

Solution

  1. Step 1: Analyze CSV input and aggregator code

    The second CSV line has 'abc' where an integer price is expected.
  2. Step 2: Understand the impact on aggregation

    Calling accessor.getInteger(1) on 'abc' will throw a runtime exception (NumberFormatException).
  3. Final Answer:

    The second CSV input 'Phone,abc' causes a runtime error due to invalid integer -> Option D
  4. Quick Check:

    Invalid integer input = runtime error [OK]
Hint: Check CSV data types match aggregator expectations [OK]
Common Mistakes:
  • Ignoring invalid CSV data causing exceptions
  • Assuming aggregator method signature is wrong
  • Thinking annotation is missing
5. You want to test a method that takes a Person object with fields name and age. You have CSV data with columns name, age, and city. How can you write a custom aggregator to ignore the city column and only aggregate name and age into Person?
hard
A. Use @AggregateWith but do not implement ArgumentsAggregator interface
B. Use ArgumentsAccessor to get only the first two columns and create Person ignoring city
C. Use @CsvSource with only two columns to avoid city
D. Use ArgumentsAccessor to get all three columns and pass city to Person constructor

Solution

  1. Step 1: Understand the CSV data and Person constructor

    CSV has three columns but Person only needs name and age.
  2. Step 2: Implement aggregator to pick only needed columns

    Use ArgumentsAccessor.getString(0) and getInteger(1) to get name and age, ignoring the third city column.
  3. Final Answer:

    Use ArgumentsAccessor to get only the first two columns and create Person ignoring city -> Option B
  4. Quick Check:

    Pick needed columns only in aggregator [OK]
Hint: Pick only needed columns with ArgumentsAccessor [OK]
Common Mistakes:
  • Trying to pass extra columns to Person constructor
  • Changing CSV source instead of aggregator logic
  • Not implementing ArgumentsAggregator interface
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard