- Mock2024년 12월 24일
- imaginaring
- 작성자
- 2024.12.24.:55
- 테스트 환경에서 실제 객체를 흉내내도록 만들어진 가짜 객체
- 주로 단위테스트에서 사용됨
- 테스트 코드가 외부 의존선에 의존하지 않고 독립적으로 테스트 될 수 있도록 도와줌
- 외부 의존성 제거
- 테스트 속도향상 - 실제 객체 대신 가짜 객체 사용으로 테스트가 더 빠르게 실행됨
- 결과 제어 - 미리 정의된 동작과 반환값을 설정, 테스트 결과 예측 가능
- 예외상황 테스트 - 특정 상황(DB 연결 실패, 네트워크 오류 등)을 쉽게 시뮬레이션 가능
- 호출 횟수 검증 - Mock객체를 통해 특정 메소드가 호출되었는지, 몇번 호출 됬는지 검증 가능
- 테스트 신뢰성이 떨어짐 : 실제 객체의 동작과 다를 수 있음
- 추가 설정 필요 : Mock 객체를 설정하고 관리하는 코드가 추가로 필요
Mock 객체 사용예제
1. 실제 객체 사용시 문제점
// 가정 : DB와 연결된 UserService를 테스트 @Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(Long id) { return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found")); } } // UserRepository는 DB와 통신하므로 단위테스트에서 DB가 필요하면 테스트가 복잡하고 느려질 수 있음
2. Mock 객체 사용
// DB 없이 UserService 테스트 가능 @SpringBootTest public class UserServiceTest { @MockBean // Mock 객체를 생성하여 Spring 컨테이너에 등록 private UserRepository userRepository; @Autowired private UserService userService; @Test void testGetUserById() { // Mock 객체의 동작 정의 User mockUser = new User(1L, "John Doe"); Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)); // 테스트 실행 User user = userService.getUserById(1L); // 결과 검증 Assertions.assertEquals("John Doe", user.getName()); // 특정 메서드 호출 여부 검증 Mockito.verify(userRepository, Mockito.times(1)).findById(1L); } }
Mock 객체 설정
- 동작 정의 : 특정 메소드가 호출되었을때 반환값 지정
Mockito.when(mockObject.someMethod()).thenReturn(someValue);
- 예외 설정 : 특정 메소드 호출 시 예외 쓰로우
Mockito.when(mockObject.someMethod()).thenThrow(new RuntimeException("Error"));
- 메소드 호출 검증 : 특정 메소드 호출 됬는지 검증
Mockito.verify(mockObject).someMethod();
Mock vs Stub
- Mock : 테스트 대상이 호출한 메소드에 대해 동작을 정의하고 호출여부 검증 (행위 기반 검증)
- Stub : 미리 정의된 반환값만 제공, 호출 여부 검증 X (상태 기반 검증)
다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)