테스트 짜다 보면 mock, stub, 이런 말이 계속 나오는데 아직도 좀 헷갈려서요. 일단 제가 지금 쓰는 방식은 이래요.
// 외부 API 호출하는 부분을 가짜로 바꿔서 정해진 값 리턴하게
jest.mock('./userApi')
userApi.getUser.mockResolvedValue({ id: 1, name: 'kim' })
이렇게 하면 실제 네트워크 안 타고 테스트가 빨라져서 좋긴 한데, 궁금한 게 몇 개 있어요.
1) 모킹을 대체 왜 쓰는 건가요? 그냥 진짜 객체 쓰면 더 정확한 테스트 아닌가 싶은데, 굳이 가짜로 바꾸는 이유가 속도 때문만은 아닌 것 같아서요.
2) 선배가 "mock 남발하면 안 된다"고 지나가듯 말했는데, 이유를 안 물어봤어요. 가짜로 다 발라놓으면 뭐가 문제가 되나요? 테스트는 초록불인데 실제로는 깨지는 상황이 생길 수 있다는 뜻인가요?
3) 그럼 어디까지 진짜를 쓰고 어디부터 가짜로 바꿔야 하는지 기준이 있나요? DB나 외부 API는 mock 하는 게 맞는 것 같은데, 내부 로직끼리도 mock 해야 하는 건지 애매해요.
테스트가 "코드를 지켜주는 안전망"이라는데, mock을 잘못 쓰면 안전망에 구멍 뚫는 느낌이라 조심스럽네요. 실무에서 감 잡는 법 알려주시면 감사하겠습니다.