공식 GitHub : https://github.com/naver/fixture-monkey
공식 문서 : https://naver.github.io/fixture-monkey/v1-0-0/docs/introduction/overview/
Fixture Monkey는 제어 가능한 임의 테스트 개체를 생성하도록 설계된 Java 및 Kotlin 라이브러리다
테스트를 하기 위해서는 테스트 객체가 필요한데, Fixture Monkey를 사용하면 이전에 사용했던 길고 긴 테스트 객체 생성에 대한 코드를 줄일 수 있다! Bean Validation
에 대한 설정이 있다면, 해당 설정에 맞게 객체를 생성해주니 안정적으로 테스트를 진행할 수 있다
build.gradle
에 dependency를 추가해준다
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.14")
테스트 클래스 내에 작성하는 경우
FixtureMonkey fixtureMonkey() {
return FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();
}
MonkeysUtils 클래스를 생성해서 사용하는 경우
package december.spring.studywithme.utils;
import com.navercorp.fixturemonkey.FixtureMonkey;
import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector;
public abstract class MonkeyUtils {
public static FixtureMonkey commonMonkey() {
return FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();
}
}
@Test
@DisplayName("댓글 생성 테스트")
void 댓글생성() {
//given
Post post = MonkeyUtils.commonMonkey().giveMeOne(Post.class);
User user = MonkeyUtils.commonMonkey().giveMeOne(User.class);
String contents = "댓글 내용입니다.";
//when
Comment comment = Comment.builder()
.post(post)
.user(user)
.contents(contents)
.build();
//then
assertThat(comment.getPost()).isEqualTo(post);
assertThat(comment.getUser()).isEqualTo(user);
assertThat(comment.getContents()).isEqualTo(contents);
}
기존의 테스트 코드였다면, Post와 User를 직접 생성해 주어야 하기 때문에 작성해야 하는 코드가 많았지만 Fixture Monkey를 사용해 단 두 줄로 테스트 객체를 만들 수 있다!
위의 블로그들과 공식문서를 참고해보면 좋다!
(공식 문서가 그리 친절하진 않아서... 나도 머리를 박박 긁으면서 사용했다...)
FixtureMonkey fixureMonkey = FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();
User user = fixtureMonkey.giveMeOne(User.class);
given
구간의 코드를 단순화하여 테스트를 더 빠르고 쉽게 작성할 수 있다.ArbitarayBuilder<User> actual = fixtureMonkey.giveMeBuilder(User.class)
.set("id", 10L)
.set("name", "name");
ArbitaryBuilder<User> actual = fixtureMonkey.giveMeBuilder(User.class);
then(actual.sample()).isNotEqualTo(actual.sample());
// inheritance
class Foo {
String foo;
}
class Bar extends Foo {
String bar;
}
Foo foo = FixtureMonkey.create().giveMeOne(Foo.class);
Bar bar = FixtureMonkey.create().giveMeone(Bar.class);
// circular-reference
class Foo {
String value;
Foo foo;
}
Foo foo = FixtureMonkey.create().giveMeOne(Foo.class);
// anonymous objects
interface Foo {
Bar getBar();
}
class Bar {
String value;
}
Foo foo = FixtureMonkey.create().giveMeOne(Foo.class);
MonkeyUtils를 사용하는 경우는 간단하게 어떤 경우에 용이한지 여쭤볼 수 있을까요? 저같은 코린이는 ConstructorPropertiesArbitraryIntrospector(주어진 생성자를 통해서 객체를 생성할 때 사용) 이게 주된 이유인가 싶습니다!