반응형

본 포스트는 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 관련 기능들을 이용하시면, 더더욱 강력한 테스트를 만들 수 있습니다.

반응형
,