Mock과 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); // 포인트 충전 후 데이터 반환
Mock 객체를 만들어 테스트 중 메서드 호출을 감시하고, 호출 여부나 호출 인자 등을 검증.
"메서드가 제대로 호출되었는가?"와 같은 상호작용을 검증.
Mock 객체 자체는 "행동"보다 "검증"에 초점을 둔다.
MyService mockService = Mockito.mock(MyService.class);
// 실제 메서드를 호출하지 않아도 됨
mockService.getData();
// 메서드 호출 여부 검증
Mockito.verify(mockService).getData(); // 호출되었는지 확인
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 반환됨