naver / fixture-monkey

Let Fixture Monkey generate test instances including edge cases automatically
https://naver.github.io/fixture-monkey
Apache License 2.0
560 stars 89 forks source link

How can I set a 'yyyyMMdd' date value in a String field? #997

Closed eastglow closed 3 months ago

eastglow commented 3 months ago

안녕하세요. 최근 픽스쳐몽키를 접하게 되어 이리저리 써보고 있는 와중에 궁금한 점이 한가지 있어 질문드립니다.

특정 객체에 String으로 선언된 필드가 하나 있는데 이 필드엔 yyyyMMdd 형태의 일자값이 들어오게 되어 있는데요, 픽스쳐몽키의 기본 룰에 따르면 String 변수이기 때문에 랜덤한 문자열이 세팅되고 있습니다.

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TestDto {

    // yyyyMMdd
    private String testDate;
}

이 필드에 대해서 랜덤한 날짜의 yyyyMMdd 형태의 문자값을 테스트 객체에 세팅해주는 방법이 혹시 있을까요?

DateArbitrary 같은 클래스를 이용해보면 어떻게든 되지 않을까 하고 만져봤는데 원하는 코드가 나오지 않아서 질문드려봅니다.

seongahjo commented 3 months ago

@eastglow 안녕하세요.

문의 주신 케이스를 해결하는 방법은 여러 가지가 있는데요, register 옵션을 사용하면 간단하게 해결할 수 있습니다. 아래와 같이 설정하면 testDate 필드는 항상 yyyyMMdd 포맷으로 생성됩니다.

혹시 이슈 있으시면 말씀해주세요.

감사합니다.

seongahjo commented 3 months ago
FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
    .register(
        TestDto.class,
        fixture -> fixture.giveMeBuilder(TestDto.class)
            .set(javaGetter(TestDto::getTestDate),
                Dates.dates().map(it -> it.format(DateTimeFormatter.ofPattern("yyyyMMdd"))))
    )
    .build();

  String actual = fixtureMonkey.giveMeOne(TestDto.class).getTestDate();

  Pattern simpleDatePattern = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");
  then(actual).matches(simpleDatePattern);
eastglow commented 3 months ago

@seongahjo

답변주신데로 적용해보니 기대한 결과대로 잘 작동합니다! 완전 빠른 답변 감사합니다. 👍

FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .register(
                TestDto.class,
                fixture -> fixture.giveMeBuilder(TestDto.class)
                        .set(javaGetter(TestDto::getIssueStrtDt), Dates.dates().map(it -> it.format(DateTimeFormatter.ofPattern("yyyyMMdd"))))
                        .set(javaGetter(TestDto::getIssueEndDt), Dates.dates().map(it -> it.format(DateTimeFormatter.ofPattern("yyyyMMdd"))))
        )
        .build();
image