EasyMock을 사용한 Service 계층 테스트1
참조 : http://www.easymock.org/EasyMock2_2_Documentation.html
패키지 구조는 다음과 같습니다.
MemberService를 구현하려는데 아직 MemberDao는 구현되어 있지 않고 MemberDao라는 인터페이스만 존재합니다.이 때 MemberServiceImpl 클래스를 TDD로 개발하기 위해 다음과 같이 작성했습니다.
public class MemberServiceImplTest {
MemberService memberService;
MemberDao mockMemberDao;
@Before
public void setUp() {
memberService = new MemberServiceImpl();
memberService.setMemberDao(mockMemberDao);
}
@Test
public void testGetMember() {
//Edge Case Test
String mail = null;
Member member = memberService.get(mail);
assertNull(member);
mail = "nonExistMail@mail.com";
member = memberService.get(mail);
assertNull(member);
//Common Case Test
mail = "existMail@mail.com";
member = memberService.get(mail);
assertNotNull(member);
assertEquals(mail, member.getMail());
}
}
위 테스트 코드를 실행하면 NullPointerExeption이 발생합니다. MemberDao 객체를 만들지도 않고 MemberService객체에 세팅하고 있기 때문이죠.
1. EasyMock을 사용하여 mock객체를 만들어서 세팅을 하겠습니다.
- EasyMock을 static import 합니다.
import static org.easymock.EasyMock.*;
- MemberDao를 MemberService에 세팅하기 전에 createMock()메소드를 사용하여 mock객체를 생성합니다.
@Before
public void setUp() {
memberService = new MemberServiceImpl();
mockMemberDao = createMock(MemberDao.class);
memberService.setMemberDao(mockMemberDao);
}
- 테스트를 돌려서 확인합니다.
MemberDao의 get() 메소드의 행위를 사전(테스트 하기 전)에 설정해주지 않았기 때문에 에러가 났습니다.
MemberServiceImple을 다음과 같이 구현해 두었습니다.
public class MemberServiceImpl implements MemberService {
private MemberDao memberDao;
public void setMemberDao(MemberDao memberDao) {
this.memberDao = memberDao;
}
public Member get(String mail) {
return memberDao.get(mail);
}
}
2. 녹화 -> 재생 -> 검증
MemberService를 구현할 때 사용한 MemberDao의 get() 메소드가 어떻게 동작할지 녹화를 해야합니다.
그리고 녹화 한 상태를 재생(replay) 시킨 다음 MemberService를 동작 시키고 마지막으로 녹화한 대로 잘 동작하였는지 검증(verify)하면 됩니다.
@Test
public void testGetMemberByNull() {
mail = null;
expect(mockMemberDao.get(mail)).andReturn(null);
replay(mockMemberDao);
member = memberService.get(mail);
assertNull(member);
verify(mockMemberDao);
}
@Test
public void testGetMemberByWrongMail() {
mail = "nonExistMail@mail.com";
expect(mockMemberDao.get(mail)).andReturn(null);
replay(mockMemberDao);
member = memberService.get(mail);
assertNull(member);
verify(mockMemberDao);
}
@Test
public void testGetMemberByCorrectMail() {
mail = "existMail@mail.com";
Member correctMember = new Member(mail);
expect(mockMemberDao.get(mail)).andReturn(correctMember);
replay(mockMemberDao);
member = memberService.get(mail);
assertNotNull(member);
assertEquals(mail, member.getMail());
verify(mockMemberDao);
}
3. 테스트가 모두 통과하여 MemberService의 get() 메소드 구현이 끝났습니다.