본문으로 건너뛰기

@Customization

@Customization 어노테이션을 사용하면 특정 비즈니스 규칙이나 요구 사항에 따라 테스트 데이터 생성을 맞춤 설정할 수 있습니다. 이 강력한 기능은 AutoParams 프레임워크와 완벽하게 통합되어 매개변수화된 테스트에 사용자 정의 논리를 적용할 수 있는 유연성을 제공합니다.

비즈니스 규칙 예

다음과 같은 몇 가지 비즈니스 규칙이 있는 Product 엔터티를 고려해 보겠습니다.

  • listPriceAmount는 100보다 크거나 같아야 합니다.
  • listPriceAmount는 1000보다 작거나 같아야 합니다.
  • sellingPriceAmount에 반영된 10% 할인을 제공해야 합니다.
@AllArgsConstructor
@Getter
public class Product {
private final UUID id;
private final String name;
private final BigDecimal listPriceAmount;
private final BigDecimal sellingPriceAmount;
}

개체 생성 사용자 정의

Customizer 인터페이스를 사용하여 이러한 규칙을 구현할 수 있습니다.

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);
}
}

테스트 메서드에 사용자 정의 적용

사용자 정의를 적용하려면 테스트 메서드에 @Customization 어노테이션을 달아야 합니다.

@ParameterizedTest
@AutoSource
@Customization(ProductGenerator.class)
void testMethod(Product arg) {
assertThat(arg.getSellingPriceAmount()).isLessThan(arg.getListPriceAmount());
}

복합 커스터마이저

복수의 사용자 정의 규칙을 적용하기 위해 복합 커스터마이저를 만들 수 있습니다.

public class DomainCustomizer extends CompositeCustomzer {
public DomainCustomizer() {
super(
new EmailGenerator(),
new UserGenerator(),
new SupplierGenerator(),
new ProductGenerator()
);
}
}

그리고 다음처럼 사용하세요.

@ParameterizedTest
@AutoSource
@Customization(DomainCustomizer.class)
void testMethod(Email email, User user, Supplier supplier, Product product) {
}

설정 가능한 속성

개체가 JavaBeans 사양을 따르고 설정할 수 있는 속성이 있는 경우 InstancePropertyCustomizer를 사용할 수 있습니다.

@Getter
@Setter
public class User {
private Long id;
private String name;
}
@ParameterizedTest
@AutoSource
@Customization(InstancePropertyWriter.class)
void testMethod(User user) {
assertNotNull(user.getId());
assertNotNull(user.getName());
}

사용자 정의 범위 지정

@Customization 어노테이션은 테스트 메서드 내의 개별 매개변수에도 적용할 수 있습니다. 적용되면 사용자 정의는 재정의되지 않는 한 모든 후속 매개변수에 영향을 미칩니다.

이 기능은 데이터 생성에 대한 미묘한 접근 방식을 제공하여 고도로 전문화되고 상황에 민감한 테스트 시나리오를 가능하게 합니다.