Mock object
모의 객체(Mock Object)란 주로 객체 지향 프로그래밍으로 개발한 프로그램을 테스트 할 경우 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제의 모듈을 "흉내"내는 "가짜" 모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다. 사용자 인터페이스(UI)나 데이터베이스 테스트 등과 같이 자동화된 테스트를 수행하기 어려운 때 널리 사용된다.
언제 Mock Object를 써야하나?
다음과 같은 상황에서 Mock Object를 사용하면 수월하게 테스트의 목적을 달성할 수 있다고 한다.
- 실제 객체가 비-결정적인(즉, 그때 그때 주변 여건에 따라 다른) 행위를 보인다.
- 실제 객체에 대한 초기 설정이 까다롭다. (DB 나 네트웍 커넥션 등이 이에 해당하겠지.)
- 실제 객체의 행위를 재현하기가 어렵다. (특정 네트웍 에러 등. ) -> 1번 이유와 비슷한 듯.
- 실제 객체 행위가 느리다. (역시 DB 작업이나 네트웍 통신등이 해당할 듯.)
- 실제 객체가 UI 를 가지고 있거나, UI 그 자체이다.
- 테스트 과정에서 객체에 질의를 던져야 할 필요가 있는데, 실제 객체는 해당 질의를 처리하지 않는다. 예) 콜백이 호출되었는 가? (이 경우 Mock Object는 실제 객체보다 "더 많은" 기능을 가지게 된다. 이는 Stub가 일반적으로 실제 객체보다 "훨씬 적은" 기능을 갖는 것과 반대이다.)
- 실제 객체는 대부분 "정상 동작"을 하지만, 아주 가끔 "예외 동작"을 한다. 단위 테스트를 통해서 특정 객체의 "정상 동작"/"예외 동작" 여부와 관계없이 시스템의 나머지 부분은 정상적인 동작을 하는 것을 확인하고자 한다.
- 아직 실제 객체를 만들지 않았다.
See also
- Google C++ Mocking Framework
- EasyMock
- Mockkito
- PowerMock
- JMockit
- TDD
Favorite site
- Wikipedia (en) Mock object에 대한 설명
- Mock 객체로 TDD에 날개를 달자! - Mockito for Python
- Mock을 이용한 단위 테스트
- Unit Testing: Test Double의 연속성 살펴보기
- Test Double
- [추천] Mocking은 코드 냄새(Code Smell)입니다 1 (Mocking, TDD)
References
-
Smoke_Art_Cubes_to_Smoke_-_ko.pdf ↩