TDD - Mock vs Stub

szlee·2024년 12월 21일
0

Java

목록 보기
33/34

Mock과 Stub은 테스트 대상 클래스나 메서드의 의존성을 대체하여 테스트를 쉽게 수행할 수 있도록 도와주는 기법

Mock vs Stub

Mock : "네가 일을 제대로 했는지 확인만 할게."

  • 주로 "행동(호출)"을 검증.
  • 검증 중심: 특정 메서드가 호출되었는지, 몇 번 호출되었는지, 어떤 파라미터로 호출되었는지 확인.
// Mock: 호출 여부와 호출된 파라미터 검증
verify(pointHistoryTable, times(1))
        .insert(eq(userId), eq(amount), eq(TransactionType.CHARGE), anyLong());

Stub: "네가 어떤 답을 줄지 미리 정해둘게."

  • 주로 "반환값"을 미리 정의.
  • 상태 중심: 특정 입력에 대해 정해진 출력이 반환되도록 설정.
// Stub: 반환값을 미리 정의하여 테스트 환경 구성
given(userPointTable.selectById(anyLong())).willReturn(null); // 신규 회원 처리
given(userPointTable.insertOrUpdate(anyLong(), anyLong())).willReturn(userPoint); // 포인트 충전 후 데이터 반환

Mocking vs Stubbing

Mocking

Mock 객체를 만들어 테스트 중 메서드 호출을 감시하고, 호출 여부나 호출 인자 등을 검증.
"메서드가 제대로 호출되었는가?"와 같은 상호작용을 검증.

Mock 객체 자체는 "행동"보다 "검증"에 초점을 둔다.

MyService mockService = Mockito.mock(MyService.class);

// 실제 메서드를 호출하지 않아도 됨
mockService.getData();

// 메서드 호출 여부 검증
Mockito.verify(mockService).getData();  // 호출되었는지 확인

Stubbing

Mock 객체에 대해 특정 메서드 호출 시 반환값이나 동작을 미리 정의해 두는 것을 의미.
"메서드가 호출되었을 때 어떤 값을 반환해야 하는가?"

실제 동작을 정의하여 테스트 대상이 가짜 데이터를 기반으로 실행되도록 설정.
보통 Mockito.when(...).thenReturn(...)이나 Mockito.doReturn(...).when(...)을 사용.

MyService mockService = Mockito.mock(MyService.class);

// Stubbing: getData 호출 시 "Stubbed Data"를 반환하도록 설정
Mockito.when(mockService.getData()).thenReturn("Stubbed Data");

// 호출
String result = mockService.getData();

// 결과 검증
assertEquals("Stubbed Data", result);  // Stubbed Data 반환됨
profile
🌱

0개의 댓글