개발을 하면서 이런 경험, 누구나 해봤을 것이다.
기능 하나 수정할 때마다 서버 재시작 → Postman 실행 → 회원가입 → 로그인 → 토큰 발급 → API 호출...매번 이런 반복 작업을 하는 건 비효율적이고 실수 가능성도 높다.
그래서 이런 과정을 자동화하기 위해 "테스트 코드 작성"에 도전하게 되었다.
내가 작성한 기능이 의도한 대로 동작하는지 자동으로 확인해주는 코드다.
개발자는 항상
“이렇게 동작해야지” 라는 기대 동작을 갖고 코드를 작성한다.
테스트 코드는 이런 기대 동작이 실제로 지켜지는지 컴퓨터가 대신 빠르게 검사해준다.
직접 확인하는 대신, 컴퓨터가 자동으로 테스트해주니 빠르고 정확하다.
이번 글에서는 테스트의 종류보다는
테스트 코드 작성에 자주 쓰이는 도구들인
Stub / Mock / Spy 를 알아볼 것이다.
고정된 응답을 제공하는 가짜 객체
- 호출 시 미리 정해둔 값만 반환한다. - 실제 로직을 실행하지 않는다.
정해진 값만 반환 한다.
실제 객체 대신 동작하며, 테스트의 독립성을 높여주는 가짜 객체
- 진짜 로직은 실행하지 않는다. - 대신 "누가 어떤 메서드를 호출했는지" 등을 확인할 수 있다.
행동(호출 여부 등)만 관찰 가능하다.
진짜 로직도 실행하면서, 호출 내용도 기록하는 객체
- 실제 메서드가 실행된다. - 호출 횟수, 인자 등을 감시(기록)할 수 있다.
진짜 실행 + 감시 가능
Java에서 Mock / Spy / Stub 등을 쉽게 만들어주는 테스트 프레임워크다.
Mock = 가짜 객체 Mockito = 가짜 객체를 만드는 도구
이제 기본적인 Stub, Mock, Spy 개념을 배웠으니,
실제로 Mockito를 이용해 간단한 테스트 코드를 작성해보자.먼저 기본적인 테스트 코드 틀은 아래와 같이 구성할 수 있다.

위와 같이 코드를 작성한 후 실행하면 다음과 같은 결과가 출력된다


테스트 코드를 작성한다고 해서 항상 Spring 컨테이너가 동작하는 것은 아니다.
위의 테스트는 순수한 단위 테스트(Unit Test)이므로 스프링 빈 주입 없이 동작한다.
(이 부분은 다음에 더 자세히 다루겠다.)

이렇게 하면 스프링 기반 테스트로 실행된다.
(이 부분도 역시 이후에 더 깊이 알아보자!)
기능이 늘어날수록 일일이 수동으로 테스트하는 건 너무 느리고 비효율적이다.
자동차 정비 후 시운전
자동차를 수리할 때마다
매번 시동을 걸고 도로에 나가서 테스트 운전을 해야 한다.
기능을 수정할 때마다
서버를 켜고 Postman으로 API 테스트를 하고, 토큰을 발급받고 다시 호출하는 작업을 반복하게 된다.
테스트 코드를 작성하면
자동 점검 시스템처럼 한 번에 결과를 확인할 수 있다.
건물 공사 중 안전망
건물 구조를 바꾸거나 리모델링할 때
안전망이 없으면 무너질까 걱정하게 된다.
테스트 코드는 안전망 역할을 한다.
코드를 변경해도 기존 기능이 정상 동작하는지 자동으로 확인해준다.
덕분에 개발자는 안심하고 코드를 수정할 수 있다.
청소 후 확인하는 체크리스트
집을 청소하거나 가구 위치를 바꿀 때
무언가 놓친 것이 없는지 일일이 확인해야 한다.
체크리스트가 있다면
변경해도 문제가 없는지 쉽게 확인할 수 있다.
테스트 코드는 코드 리팩터링 시의 체크리스트 역할을 한다.
덕분에 개발자는 안심하고 코드를 개선할 수 있다.
팀 프로젝트에서 자동 품질 검사
영화 촬영에서 팀원이 찍은 컷마다
감독이 직접 확인하기는 어렵다.
자동화된 품질 검사 프로세스가 있다면
팀원이 올린 컷이 기준에 맞는지 자동으로 검사할 수 있다.
테스트 코드는 팀 개발에서 자동으로 품질을 검사하는 도구다.
덕분에 코드 리뷰 시 코드에 대한 신뢰도가 높아진다.
빵 공장의 자동 품질 검사기
빵 하나하나를 사람이 직접 확인하면 느리고 실수가 발생한다.
자동 검사기는 빠르게 빵이 기준에 맞는지 검사할 수 있다.
테스트 코드는 코드에 대한 자동 검사기다.
코드를 변경하거나 배포하기 전에 빠르고 정확하게 품질을 보장해준다.
Stub: 고정된 응답 제공
Mock: 가짜 객체 + 행동 검증
Spy: 진짜 실행 + 행동 검증
Mockito: Mock / Spy 등을 쉽게 만드는 도구
테스트 더블을 활용하면 테스트가 더 빠르고 안정적이다.