본 포스트는 JUnit에 대한 기초적인 지식이 있다는 가정하에 작성되었습니다.
spring test에서 지원하는 MockMVC의 경우,
테스트를 돌릴 때마다, application Context를 로딩하는 시간때문에 사전 대기 시간이 걸린다는 게 좀 아쉬웠습니다.
(그래봐야 몇 초 안되지만... 우리들은 한국인)
그러던 중, spring mvc구조에서 매우 쉽게 도입할 수 있는 Mockito라는 녀석을 찾게 되었습니다.
매뉴얼도 한국어군요.. 매우 훌륭합니다.
https://code.google.com/p/mockito/wiki/MockitoFeaturesInKorean
JUnit과의 연동도 매우 훌륭합니다. (거의 할게 없을 정도..)
@RunWith(MockitoJUnitRunner.class) 이거 하나만 테스트가 작성될 클래스에 붙여주면 됩니다.
Mocking하는 과정도 매우 간단합니다.
만약에 LoginDao라는 객체를 Bean으로 만들어서 쓰는 구조라면..
아래와 같이 @Mock만 붙여주면 끝납니다.
※ Mocking : 예를들어 DB통신하는 객체가 있다면, DB통신 없이도 동일하게 행동하도록 다른 객체로 바꿈.
@Mock
LoginDao loginDao;
Mocking하려는 객체가 참조하는 다른 Bean이 있는경우..
만약에 LoginService가 LoginDao를 포함하는 구조라고 합시다.
아래와 같이 써주면, 포함된 Bean들도 모두 Mock객체로 만들어줍니다.
@InjectMocks
LoginService loginService;
여기까지 Mock객체 생성법이었구요.
이제 Stubbing에 대해 알아보도록 하죠.
Mock객체가 실제로 DB통신등 네트워크 통신을 하지 않고 메모리상에서만 돌아가기 때문에,
대규모 프로젝트에서는 이게 좀 귀찮은 작업이 될 수 있습니다.
loginDao의 login(int a, String b)이라는 메소드가 있다고 치고, 리턴형이 int라고 가정합시다.
그리고 해당 메소드에서 무조건 10이라는 값이 나오게 하고 싶습니다.
그럴 경우, 아래와 같이 작성할 수 있습니다.
when(loginDao.login(anyInt(), anyString())).thenReturn(10);
- argument에 정확한 값을 넣어도 되지만, 보통은 어떤 값이 들어올지 모르기 때문에, 아무값이나~ 라는 anyInt(), anyString()등의 기능도 지원을 해줍니다.
이후에 JUnit에서 지원하는 Assert관련 메소드등을 이용해서 값 검증을 하시고,
Mockito에서 지원하는 verify 관련 기능들을 이용하시면, 더더욱 강력한 테스트를 만들 수 있습니다.
'개발 > Testing' 카테고리의 다른 글
[JUnit] Parameterized (0) | 2016.06.11 |
---|---|
[PowerMock] private mock (0) | 2016.06.11 |
[Mockito] Spring RestTemplate Mocking (0) | 2016.06.11 |
[JUnit] Exception을 Customizing 한 경우 내부 값을 확인하고자 할때 (0) | 2016.06.11 |
[BDD] JBeHave를 이용한 Behavior Driven Development (0) | 2016.06.11 |