클린 아키텍처를 공부하면서 자연스럽게 테스트 코드 작성법에 대해 알게 되었는데, Mock 라는 객체를 사용하여 알게 된 내용을 정리하려고 한다.
Mock는 왜 필요할까?
- 진짜 객체를 테스트 환경에서 사용하기 어려운 경우가 많다.
- 예를 들어, 네트워크 요청이나 DB 접근 또는 파일 시스템 작업처럼 실행에 있어 시간이 오래 걸리거나 외부 의존성이 있는 코드를 테스트 를 테스트 할 때 가짜 객체를 만들어 테스트를 편하게 할 수 있도록 해준다.
상황으로 Mock의 역할을 쉽게 이해하기
- 실제 공연에서 진짜 소품(예: 유리잔)을 사용하는 대신, 리허설에서는 깨지지 않는 플라스틱 잔ㅇ르 사용한다고 가정해보자.
- 이유: 진짜 유리잔은 매번 사용하게 되면 깨질 위험도 있고, 리허설 시간이 길어질 수 있기 때문이다.
- 여기서 플라스틱 잔은 Mock이며, 유리잔은 실제 객체라고 생각하면 된다. 즉, 테스트 환경에 맞게 안정하고 효율적이게 해준다고 보면 된다.
예제 코드
interface UserRepository {
fun getUserById(userId: String): User
}
class UserServiceTest {
@Test
fun `getUserById should return user`() {
val userRepository = mock<UserRepository>()
val mockUser = User("123", "Alice")
whenever(userRepository.getUserById("123")).thenReturn(mockUser)
val result = userRepository.getUserById("123")
assertEquals("Alice", result.name)
}
}
Mock 장점
- 테스트 속도 향상: 네트워크나 DB 호출 없이 빠르게 테스트가 가능하다.
- 독립성 보장: 테스트 코드가 외부 시스템에 의존하지 않는다.
- 다양한 시나리오 검즘: Mock로 에러 상황이나 특정 조건을 쉽게 재현이 가능하다.
요약하면,,
- Mock를 진짜 객체 대신 테스트를 도와주는 대역 배우라고 생각하면 된다. 진짜 객체처럼 동작하지만, 가짜라서 더 빠르고 안전하게 원하는 상황을 재현할 수 있다.