<aside>
💡 2장에서 다루는 내용
- 단위 테스트란?
- 공유 의존성, 비공개 의존성, 휘발성 의존성 간의 차이점
- 단위 테스트의 두 분파: 고전파와 런던파
- 단위 테스트, 통합 테스트, 엔드 투 엔드 테스트의 차이점
</aside>
2.1 ‘단위 테스트’의 정의
단위 테스트에는 많은 정의가 있는데 쉽게 다음과 같이 세 가지 속성이 있다.
- 작은 코드 조각(단위)을 검증하고
- 빠르게 수행하고
- 격리된 방식으로 처리하는 자동화된 테스트다. → 대중의 의견이 크게 다른 속성
- 격리 문제는 고전파와 런던파를 구분할 수 있게 해주는 근원적 차이
<aside>
💡 단위 테스트의 고전파와 런던파
✔️ 고전적 접근법은 ‘디트로이트(Detroit)’라고도 하며 단위 테스트에 대한 고전주의적 접근법
✔️ 런던 스타일은 때때로 ‘목 추종자(mockist)’로 표현
</aside>
2.1.1 격리 문제에 대한 런던파의 접근
- 런던파에서는 테스트 대상 시스템을 협력자(Collaborator)에게서 격리하는 것을 말한다.
- 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역으로 대체해야한다.
- 외부 영향과 분리해서 테스트 대상 클래스에만 집중 가능
→ 테스트가 실패하면 코드베이스의 어느 부분이 문제인지 알 수 있다.
- 객체 그래프를 분할 할 수 있다.
→ 모든 클래스가 각각 직접적인 의존성을 갖고 있으며 또 그 의존성이 또 다른 의존성을 갖고 있는 형태로 그래프가 상당히 복잡해 질 수 있다.

그림 2.1 테스트 대상 시스템의 의존성을 테스트 대역으로 대체하면, 테스트 대상 시스템만 검증하는데 집중할 수 있을 뿐만 아니라 규모가 큰 상호 연결 객체 그래프를 분할할 수 있다.
- 따라서, 테스트 대역을 사용하면 객체 그래프를 다시 만들거나 직접적인 의존성을 대체할 수 있고, 전체 단위 테스트 스위트를 간단한 구조로 할 수 있다.

그림 2.2 테스트 대상 클래스를 의존성에서 분리하면 단순한 테스트 스위트 구조(제품 코드의 각 클래스에 대해 테스트 클래스가 하나씩 있는 구조)를 확립하는 데 도움이 된다.
- 예제 2.1 - 고전적인 스타일로 작성된 상점에 재고가 충분히 있을 때만 구매가 성공하는지 검증하는 두가지 테스트
- 의존성과 테스트 대상 시스템을 모두 준비해야한다.
- 예제 2.2 - 고전적인 스타일에서 Store 인스턴스를 목(Mock) 으로 대체하여 런던 스타일로 작성한다.
Unit-Test-Study/sample-code/src at main · byeongsoon/Unit-Test-Study
<aside>
💡 테스트 대상 시스템(SUT, System Under Test)
테스트 대상 메서드(MUT, Method Under Test) : 테스트에서 호출한 SUT의 메서드
MUT와 SUT는 흔히 동의어로 사용하지만, 일반적으로는 MUT는 메서드를 가리키는 데 반해 SUT는 클래스 전체를 가리킨다.
</aside>