@Customization
@Customization
어노테이션을 사용하면 특정 비즈니스 규칙이나 요구 사항에 따라 테스트 데이터 생성을 맞춤 설정할 수 있습니다. 이 강력한 기능은 AutoParams 프레임워크와 완벽하게 통합되어 매개변수화된 테스트에 사용자 정의 논리를 적용할 수 있는 유연성을 제공합니다.
비즈니스 규칙 예
다음과 같은 몇 가지 비즈니스 규칙이 있는 Product 엔터티를 고려해 보겠습니다.
listPriceAmount
는 100보다 크거나 같아야 합니다.listPriceAmount
는 1000보다 작거나 같아야 합니다.sellingPriceAmount
에 반영된 10% 할인을 제공해야 합니다.
- Java
- Kotlin
@AllArgsConstructor
@Getter
public class Product {
private final UUID id;
private final String name;
private final BigDecimal listPriceAmount;
private final BigDecimal sellingPriceAmount;
}
class Product(
val id: UUID,
val name: String,
val listPriceAmount: BigDecimal,
val sellingPriceAmount: BigDecimal
)
개체 생성 사용자 정의
Customizer
인터페이스를 사용하여 이러한 규칙을 구현할 수 있습니다.
- Java
- Kotlin
public class ProductGenerator extends ObjectGeneratorBase<Product> {
@Override
protected Product generateObject(ObjectQuery query, ResolutionContext context) {
UUID id = context.resolve(UUID.class);
String name = context.resolve(String.class);
ThreadLocalRandom random = ThreadLocalRandom.current();
BigDecimal listPriceAmount = new BigDecimal(random.nextInt(100, 1000 + 1));
BigDecimal sellingPriceAmount = listPriceAmount.multiply(new BigDecimal("0.9"));
return new Product(id, name, listPriceAmount, sellingPriceAmount);
}
}
class ProductGenerator : ObjectGeneratorBase<Product>() {
override fun generateObject(query: ObjectQuery, context: ResolutionContext): Product {
val id = context.resolve(UUID::class.java)
val name = context.resolve(String::class.java)
val random = ThreadLocalRandom.current()
val listPriceAmount = BigDecimal(random.nextInt(100, 1000 + 1))
val sellingPriceAmount = listPriceAmount.multiply(BigDecimal("0.9"))
return Product(id, name, listPriceAmount, sellingPriceAmount)
}
}
테스트 메서드에 사용자 정의 적용
사용자 정의를 적용하려면 테스트 메서드에 @Customization
어노테이션을 달아야 합니다.
- Java
- Kotlin
@ParameterizedTest
@AutoSource
@Customization(ProductGenerator.class)
void testMethod(Product arg) {
assertThat(arg.getSellingPriceAmount()).isLessThan(arg.getListPriceAmount());
}
@ParameterizedTest
@AutoSource
@Customization(ProductGenerator::class)
fun testMethod(arg: Product) {
assertThat(arg.sellingPriceAmount).isLessThan(arg.listPriceAmount)
}
복합 커스터마이저
복수의 사용자 정의 규칙을 적용하기 위해 복합 커스터마이저를 만들 수 있습니다.
- Java
- Kotlin
public class DomainCustomizer extends CompositeCustomzer {
public DomainCustomizer() {
super(
new EmailGenerator(),
new UserGenerator(),
new SupplierGenerator(),
new ProductGenerator()
);
}
}
class DomainCustomizer : CompositeCustomizer(
EmailGenerator(),
UserGenerator(),
SupplierGenerator(),
ProductGenerator()
)
그리고 다음처럼 사용하세요.
- Java
- Kotlin
@ParameterizedTest
@AutoSource
@Customization(DomainCustomizer.class)
void testMethod(Email email, User user, Supplier supplier, Product product) {
}
@ParameterizedTest
@AutoSource
@Customization(DomainCustomizer::class)
fun testMethod(email: Email, user: User, supplier: Supplier, product: Product) {
}
설정 가능한 속성
개체가 JavaBeans 사양을 따르고 설정할 수 있는 속성이 있는 경우 InstancePropertyCustomizer
를 사용할 수 있습니다.
- Java
- Kotlin
@Getter
@Setter
public class User {
private Long id;
private String name;
}
class User {
var id: Long? = null
var name: String? = null
}
- Java
- Kotlin
@ParameterizedTest
@AutoSource
@Customization(InstancePropertyWriter.class)
void testMethod(User user) {
assertNotNull(user.getId());
assertNotNull(user.getName());
}
@ParameterizedTest
@AutoSource
@Customization(InstancePropertyWriter::class)
fun testMethod(user: User) {
assertNotNull(user.id)
assertNotNull(user.name)
}
사용자 정의 범위 지정
@Customization
어노테이션은 테스트 메서드 내의 개별 매개변수에도 적용할 수 있습니다. 적용되면 사용자 정의는 재정의되지 않는 한 모든 후속 매개변수에 영향을 미칩니다.
이 기능은 데이터 생성에 대한 미묘한 접근 방식을 제공하여 고도로 전문화되고 상황에 민감한 테스트 시나리오를 가능하게 합니다.