테스트 환경에서 실제 객체를 대체하기 위해 사용하는 객체를 통칭하는 말이에요. 마치 영화에서 실제 배우 대신 사용하는 스턴트 더블 같은 개념이라고 보면 돼요.
Dummy
- 정의 : 아무동작도 하지 않는 객체를 의미합니다.
- 용도 : 필요하지만 사용되지 않는 객체를 대신 채울때, null 대신 넣을 호출되지 않는 인자
예시
val dummyLogger = DummyLogger()
val userService = UserService(dummyLogger) // logger는 주입은 해줘야하지만 테스트 하고픈 로직에서는 사용 안됨
- 정의 : 실제 동작을 흉내낸 간단한 가짜 구현체.
- 용도 : 실제 DB나 API 대신 사용할 수 있는 간단한 대체 구현, 인메모리 DB, 가짜 알고리즘 등
예시
class FakeUserRepository : UserRepository {
private val users = mutableListOf<User>()
override fun save(user: User) = users.add(user)
override fun findByEmail(email: String) = users.find { it.email == email }
}
- 정의 : 호출 시, 미리 정해진 값을 반환하는 객체.
- 용도 : 테스트 대상이 의존하는 객체가 항상 일정한 응답을 하도록 고정할 때., 항상 true를 반환하는 인증 Stub
class StubEmailValidator : EmailValidator {
override fun isValid(email: String) = true // 항상 true 반환
}
- 정의 : 실제 객체처럼 동작하면서 호출 횟수나 파라미터를 기록함
- 용도 : 검증용으로 얼마나 불렸는지, 어떤값으로 불렸는지 확인 함, 메서드 호출 여부/ 횟수 추적 가능
val emailService = spy(RealEmailService())
userService.registerUser("a@a.com")
verify(emailService, times(1)).sendWelcomeEmail("a@a.com")
- 정의 : 행동 정의 + 검증 기능을 함께 가진 객체 (주로 Mockito 등 프레임워크 사용)
- 용도 : 가짜 객체 생성 + 동작 설정 + 호출 검증까지 다 할 때.
val mockRepo = mock(UserRepository::class.java)
whenever(mockRepo.findByEmail("a@a.com")).thenReturn(User("a@a.com"))
구분 | 실제동작 | 고정응답 | 호출기록 | 목적 |
Dummy | ❌ | ❌ | ❌ | 채우기 용도 |
Fake | ✅ | ❌ | ❌ | 간단한 가짜 구현 |
Stub | ❌ | ✅ | ❌ | 고정 응답 반환 |
Spy | ✅ | ❌ | ✅ | 호출 감시 |
Mock | ❌ | ✅ | ✅ | 테스트 전용 설정 + 검증 |
[Kotlin] Object & Companion Object (0) | 2021.09.21 |
---|---|
[Kotlin] Data Class (데이터 클래스) (0) | 2021.09.21 |
[Kotlin] 표준함수 (0) | 2020.12.06 |
[Kotlin] 문자열 (0) | 2020.12.05 |
[Kotlin] 익명 함수와 함수 타입 (1) | 2020.12.05 |