테스트를 진행하던 도중, 엔티티 더미 데이터를 생성할 필요가 생겼다.
그러나, 이를 생성하는것도 일이었다.
그러던 도중, 데이터 생성에 도움을 주는 FixtureMonkey
를 알게 되었고, 간단하게 사용해보는 시간을 가져보았다.
예시 코드를 통해 사용하는 방법을 간접적으로 소개해보는 시간을 가져본다.
@Test
void test() {
// given
FixtureMonkey fixtureMonkey = FixtureMonkey.create();
// when
Animal actual = fixtureMonkey.giveMeOne(Animal.class);
// then
System.out.println(actual);
}
BeanArbitraryIntrospector
FieldReflectionArbitraryIntrospector
ConstructorPropertiesArbitraryIntrospector
@ConstructorProperties
어노테이션을 달아줘야 함record
면 됨lombok.anyConstructor.addConstructorProperties=true
을 설정해주면 됨BuilderArbitraryIntrospector
@Builder
를 통해 생성 가능FailoverArbitraryIntrospector
@Test
void test() {
// given
FixtureMonkey fixtureMonkey = FixtureMonkey.create();
// when
Animal actual = fixtureMonkey.giveMeOne(Animal.class);
// then
System.out.println(actual);
}
// 임의 Integer 생성
Integer number = FixtureMonkey.create().giveMeOne(Integer.class);
// 100 이상 임의 Integer 생성
Integer number2 = FixtureMonkey.create().giveMeBuilder(Integer.class)
.set(Arbitraries.integers().greaterOrEqual(100)).sample();
FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
.objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE)
.build();
// 임의 객체 생성
List<Sample> sample = fixtureMonkey.giveMe(Sample.class, 100);
sample.forEach(System.out::println);
System.out.println("===============================");
// 임의 객체 생성
List<Sample> sample2 = fixtureMonkey.giveMeBuilder(Sample.class)
.set("age", Arbitraries.integers().between(1, 100))
.set("title", Arbitraries.strings().ofLength(10).alpha())
.sampleList(10);
sample2.forEach(System.out::println);
Sample actual = fixtureMonkey.giveMeBuilder(Sample.class)
.set("age", 1000)
.set("title", "Book")
.sample();
System.out.println(sample);
// 한글 설정
List<Sample> sample3 = fixtureMonkey.giveMeBuilder(Sample.class)
.set("age", Arbitraries.integers().between(1, 100))
.set("title", Arbitraries.strings().ofLength(10).withCharRange((char) 0xAC00,
(char) 0xD7A3))
.sampleList(10);
sample3.forEach(System.out::println);
// 배열에 들어간 값만 랜덤으로 배정
char[] chars = {'가', '나', '다', '라', '마'};
List<Sample> sample4 = fixtureMonkey.giveMeBuilder(Sample.class)
.set("age", Arbitraries.integers().between(1, 100))
.set("title", Arbitraries.strings().ofLength(10).withChars(chars))
.sampleList(10);
sample4.forEach(System.out::println);
@BeforeEach
public void setup(){
fixtureMonkey = FixtureMonkey.builder()
.plugin(new JakartaValidationPlugin())
.objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE)
.build();
}
@Test
public void relationalTest(){
List<User> users = fixtureMonkey.giveMeBuilder(User.class)
.setNotNull("*")
.set("password", Arbitraries.strings().withCharRange('a', 'z').ofLength(10))
.sampleList(1000);
userRepository.saveAll(users);
List<Card> cards = fixtureMonkey.giveMeBuilder(Card.class)
.setNotNull("*")
.setNull("comments")
.set("user", Arbitraries.of(users))
.sampleList(30);
cardRepository.saveAll(cards);
cards.forEach(System.out::println);
}
testImplementation
으로 추가해두기