이것저것

단위 테스트 Test Double

코딩공부 2025. 3. 3. 02:24

Test Double

테스트에서 실제 객체를 대체하는 모든 종류의 객체를 의미하는 포괄적인 개념

Test Double의 종류

 

Dummy - 아무것도 하지 않는 깡통 객체 (예: null 리턴, 빈 객체)

 

Fake - 단순한 형태로 동일한 기능은 수행하나, 프로덕션에서 쓰기에는 부족한 객체 

(ex, FakeRepository)

 

Stub - 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체

그 외에는 응답하지 않는다.

 

Spy
- Stub이면서호출된 내용을 기록하여 보여줄 수 있는 객체

일부는 실제 객체처럼 동작시키고 일부만 stubbing 할 수 있다.

-간단한 로직을 포함하여 동작하는 객체

 

Mock - 행위에 대한 기대를 명세하고, 그에 따라 동작하도록 만들어진 객체 

 

 

Stub 과 Mock 은 다르다.

구분 Stub Mock
목적 특정 입력에 대해 미리 정의된 값을 반환 호출 여부 및 인자 검증 (행동 기반 테스트)
검증 방식 반환값이 올바른지 검증 (상태 기반 테스트) 특정 메서드가 예상대로 호출되었는지 검증 (행동 기반 테스트)
예제 API 응답을 미리 정의 특정 메서드가 몇 번 호출되었는지 확인
라이브러리 Mockito.when(...).thenReturn(...) Mockito.verify(...)

 

Stub 상태 검증 - 메일이 보내고 return 값 검증

Mock 행위검증 - mock이 그 행위를 했는지 검증 

 

보통 Mockito를 통해서 Mock을 사용

class UserServiceTest {
    @Test
    fun `유저를 저장하면 이메일을 전송해야 한다`() {
        val emailService = mock(EmailService::class.java)  // Mock 객체 생성
        val userService = UserService(emailService)  

        val user = User("test@example.com")
        userService.registerUser(user)  

        // 이메일 전송이 한 번 호출되었는지 검증
        verify(emailService, times(1)).sendEmail(user.email)
    }
}

mock(): EmailService의 Mock 객체 생성
verify(): sendEmail 메서드가 정확히 1번 호출되었는지 검증

 

'이것저것' 카테고리의 다른 글

Mock 관련 Annotations  (0) 2025.03.03
Web Cache  (0) 2024.06.28
HTTPS, SSL  (0) 2024.06.27