테스트 대상 객체가 다른 객체와 의존성이 있는 경우 테스트가 어려워짐 → 테스트에 영향이 없도록 의존성이 있는 객체에 대해서는 실제 구현체 대신 해당 객체의 동작을 모방하는 객체를 사용
테스트 더블(Test Double)
테스트에서 테스트 대상 코드와 상호작용하는 실제 객체를 대체하는 객체
- 실제 객체를 사용하는 것보다 빠른 실행 가능
- 외부 의존성(네트워크 지연, 데이터베이스 상태 등)을 제거하여 테스트를 쉽게 제어
- 테스트 환경을 더욱 안정적이고 예측 가능하게 만들 수 있음
Stub
미리 정의된 값을 반환하도록 설정된 객체
- 테스트 중 특정 메서드가 호출될 때, 복잡한 로직 없이 미리 정의된 값을 반환하고자 할 때 사용
- 네트워크 요청이나 데이터베이스 조회와 등 외부 의존성을 제거하고 테스트를 단순화할 때 유용
- e.g. 데이터베이스 조회 결과나 외부 API 호출 결과를 테스트에 필요한, 미리 정의된 값으로 대체할 때
Fake
실제 구현과 비슷하지만 단순화된 버전의 객체
- 실제 구현을 대신하여 테스트 환경에서 사용될 수 있는 간단한 버전을 만들고자 할 때 사용
- 실제 데이터베이스 대신 메모리 내 데이터베이스를 사용하여 테스트할 때 유용
- e.g. 인메모리 데이터베이스를 사용하여 데이터베이스 의존성을 제거하고 테스트할 때
Spy
객체와의 상호작용을 기록하는 모방 객체
- 실제 객체의 동작을 유지하면서 특정 메서드가 호출되었는지, 어떤 인자로 호출되었는지 검증하고자 할 때 사용
- 실제 객체의 일부 메서드만 모킹하고 나머지 메서드는 실제 동작을 유지하고자 할 때 유용
Mock
동작을 사전 정의하고, 해당 동작이 호출되었는지 검증할 수 있는 객체
- 테스트 후 특정 메서드가 호출되었는지, 어떤 인자로 호출되었는지 검증할 때 사용
- 테스트 대상이 다른 객체와 상호작용하는 방식을 확인하고자 할 때 유용
- e.g. 특정 메서드나 API 호출이 올바르게 이루어졌는지 확인할 때
Spy와 Mock의 차이점
- Spy
- 실제 객체를 감싸서 실제 메서드를 호출하며, 필요한 경우 일부 메서드만 모킹
- 기본적으로 실제 객체의 메서드가 호출되며 특정 메서드만 별도로 정의할 수 있음
- Mock
- 기본적으로 사전 정의된 동작을 수행하며, 실제 객체와는 무관하게 동작
- 메서드 호출 시의 행동을 사전에 정의 가능 (e.g. 특정 값을 반환하거나 예외를 던짐)
reference: https://kotlinworld.com/481#Test Doubles를 사용하기 위한 환경 설정-1
'study > 소프트웨어 공학' 카테고리의 다른 글
클린 아키텍처(Clean Architecture) (0) | 2024.07.07 |
---|---|
레이어드 아키텍처: 3-tier architecture (0) | 2024.07.07 |
테스트 코드: 단위 테스트, 통합 테스트, E2E 테스트 (0) | 2024.06.27 |
Anemic Domain Model vs Rich Domain Model (0) | 2024.06.27 |
MVC 패턴 (0) | 2024.05.30 |