Follow below procedure to implement custom aggregators.
Step 1: Implement ArgumentsAggregator interface.
public class PersonAggregator implements ArgumentsAggregator {
@Override
public Person aggregateArguments(ArgumentsAccessor arguments, ParameterContext context)
throws ArgumentsAggregationException {
return new Person(arguments.getString(0), arguments.getString(1), arguments.get(2, Gender.class),
arguments.get(3, LocalDate.class));
}
}
Step 2: Use the aggregator defined in step 1.
void testWithArgumentsAggregator(@AggregateWith(PersonAggregator.class) Person person) {
if (person.getFirstName().equals("Sailu")) {
assertEquals(Gender.FEMALE, person.getGender());
assertEquals("PTR", person.getLastName());
assertEquals(1989, person.getDateOfBirth().getYear());
} else {
assertEquals(Gender.MALE, person.getGender());
assertEquals("Ram", person.getFirstName());
assertEquals("Gurram", person.getLastName());
assertEquals(1990, person.getDateOfBirth().getYear());
}
}
Find the below working application.
Gender.java
package com.sample.app.model;
public enum Gender {
FEMALE, MALE
}
Person.java
package com.sample.app.model;
import java.time.LocalDate;
public class Person {
private String firstName;
private String lastName;
private Gender gender;
private LocalDate dateOfBirth;
public Person(String firstName, String lastName, Gender gender, LocalDate dateOfBirth) {
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.dateOfBirth = dateOfBirth;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
PersonAggregator.java
package com.sample.app.aggregators;
import java.time.LocalDate;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
import org.junit.jupiter.params.aggregator.ArgumentsAggregationException;
import org.junit.jupiter.params.aggregator.ArgumentsAggregator;
import com.sample.app.model.Gender;
import com.sample.app.model.Person;
public class PersonAggregator implements ArgumentsAggregator {
@Override
public Person aggregateArguments(ArgumentsAccessor arguments, ParameterContext context)
throws ArgumentsAggregationException {
return new Person(arguments.getString(0), arguments.getString(1), arguments.get(2, Gender.class),
arguments.get(3, LocalDate.class));
}
}
CustomAggregatorTest.java
package com.sample.app;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.aggregator.AggregateWith;
import org.junit.jupiter.params.provider.CsvSource;
import com.sample.app.aggregators.PersonAggregator;
import com.sample.app.model.Gender;
import com.sample.app.model.Person;
public class CustomAggregatorTest {
@ParameterizedTest
@CsvSource({
"Sailu, PTR, FEMALE, 1989-08-20",
"Ram, Gurram, MALE, 1990-01-22"
})
void testWithArgumentsAggregator(@AggregateWith(PersonAggregator.class) Person person) {
if (person.getFirstName().equals("Sailu")) {
assertEquals(Gender.FEMALE, person.getGender());
assertEquals("PTR", person.getLastName());
assertEquals(1989, person.getDateOfBirth().getYear());
} else {
assertEquals(Gender.MALE, person.getGender());
assertEquals("Ram", person.getFirstName());
assertEquals("Gurram", person.getLastName());
assertEquals(1990, person.getDateOfBirth().getYear());
}
}
}
Run above test class, you will see the test result in junit window.
You can even create a custom annotation that is composed of multiple annotations use.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@AggregateWith(PersonAggregator.class)
public @interface CsvToPerson {
}
@ParameterizedTest
@CsvSource({
"Sailu, PTR, FEMALE, 1989-08-20",
"Ram, Gurram, MALE, 1990-01-22"
})
void testWithArgumentsAggregator(@CsvToPerson Person person) {
.......
.......
}
Find the below working application.
CsvToPerson.java
package com.sample.app.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.params.aggregator.AggregateWith;
import com.sample.app.aggregators.PersonAggregator;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@AggregateWith(PersonAggregator.class)
public @interface CsvToPerson {
}
CustomAggregatorTest2.java
package com.sample.app;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import com.sample.app.annotations.CsvToPerson;
import com.sample.app.model.Gender;
import com.sample.app.model.Person;
public class CustomAggregatorTest2 {
@ParameterizedTest
@CsvSource({
"Sailu, PTR, FEMALE, 1989-08-20",
"Ram, Gurram, MALE, 1990-01-22"
})
void testWithArgumentsAggregator(@CsvToPerson Person person) {
if (person.getFirstName().equals("Sailu")) {
assertEquals(Gender.FEMALE, person.getGender());
assertEquals("PTR", person.getLastName());
assertEquals(1989, person.getDateOfBirth().getYear());
} else {
assertEquals(Gender.MALE, person.getGender());
assertEquals("Ram", person.getFirstName());
assertEquals("Gurram", person.getLastName());
assertEquals(1990, person.getDateOfBirth().getYear());
}
}
}
No comments:
Post a Comment