[테스트 데이터] 테스트에 필요한 데이터 만들기
@Test
public void calcTotalAttendanceRate() throws Exception {
Member member = new Member();
Study study1 = new Study();
Meeting meeting1 = new Meeting();
Meeting meeting2 = new Meeting();
Meeting meeting3 = new Meeting();
Study study2 = new Study();
study1.addMeeting(meeting1);
study1.addMeeting(meeting2);
study2.addMeeting(meeting3);
member.addJoinedStudy(study1);
member.addJoinedStudy(study2);
member.applyAttendance(meeting1);
member.applyAttendance(meeting2);
int attendanceSize = member.getAttendances().size();
assertThat(attendanceSize, is(2));
assertThat(member.getStudies().size(), is(2));
assertThat(study1.getMeetingCount(), is(2));
assertThat(study2.getMeetingCount(), is(1));
when(mockStudyRepository.getConfirmedAttendanceCountOf(member)).thenReturn(1);
when(mockStudyRepository.getTotalAttandanceCountOf(member)).thenReturn(attendanceSize);
memberService.calcRatesOf(member);
assertThat(member.getTotalAttendanceRate(), is(33));
assertThat(member.getTotalTrustRate(), is(50));
}
이 테스트에서 절반 이상이 테스트 데이터를 만들고 그 부분을 검증하는 코드입니다. 이 부분을 다음과 같이 바꿀 수 있다면.. 좋을까요? 안 좋을까요?
Meeting meeting1 = Builder.Create(Meeting.class).Build();
Meeting meeting2 = Builder.Create(Meeting.class).Build();
Meeting meeting3 = Builder.Create(Meeting.class).Build();
Builder.Create(Member.class)
.addStudy(Builder.Create(Study.class)
.addMeeting(meeting1)
.addMeeting(meeting2)
.Build())
.addStudy(Builder.Create(Study.class)
.addMeeting(meeting3)
.Build())
.addAttendance(Builder.Create(Attendance.class)
.addMeeting(meeting1)
.Build())
.addAttendance(Builder.Create(Attendance.class)
.addMeeting(meeting2)
.Build())
.Build();
Object Mother에 대한 글을 찾아 보다가 Test Data Builder에 대한 글과 거기에 달린 댓글을 통해 닷넷에서 사용하는 NBuilder라는 것까지 대충 살펴봤는데.. 이거 뭐.. 해보지 않고서는 어떨지 잘 상상이 안 되네요.
http://martinfowler.com/bliki/ObjectMother.html
http://c2.com/cgi/wiki?ObjectMother
http://geekswithblogs.net/Podwysocki/archive/2008/01/08/118362.aspx
http://www.nbuilder.org/
그래서 일단은 위와 같이 상상 코딩을 해보았는데.. 어떨런지요.. 흠..