목의 가치 극대화하기

  • 비관리 의존성에만 목을 사용하게끔 제한하는 것은 중요하지만, 이는 목의 가치를 극대화 하기 위한 첫 번째 단계일 뿐이다.

시스템 끝에서 상호 작용 검증하기

  • 시스템 끝에 있는 비관리 의존성을 목킹하여 상호 작용을 검증하라.
    • 어떤 라이브러리에 대한 래퍼 클래스가 있으면, 래퍼 클래스 내에 있는 라이브러리 클래스를 목으로 검증하라.
  • 시스템의 끝에서 상호 작용을 확인하면 회귀 방지가 좋아질 뿐만 아니라 리팩터링 내성도 향상된다.

목을 스파이로 대체하기

  • 스파이는 수동으로 작성하는 반면에 목은 목 프레임워크의 도움을 받아 생성한다는 것이 차이점이다.
  • 시스템 끝에 있는 클래스의 경우 스파이가 목보다 낫다.
    • 스파이는 검증 단계에서 코드를 재사용해 테스트 크기를 줄이고 가독성을 향상시킨다.
  • 스파이 클래스에 플루언트 인터페이스를 제공하면 상호작용을 검증하는 것이 간결해지고 표현력도 생긴다.
    • 플루언트 인터페이스: 메서드 체이닝을 기반으로 코드가 쉬운 영어 문자으로 보이게끔 가독성을 향상 시키는 API 설계 기법이다.

목 처리에 대한 모범 사례

  • 목 처리와 관련된 모범 사례
    • 비관리 의존성에만 목 적용하기
    • 시스템 끝에 있는 의존성에 대해 상호 작용 검증하기
    • 통합 테스트에서만 목을 사용하고 단위 테스트에서는 하지 않기
    • 항상 목 호출 수 확인하기
    • 보유 타입만 목으로 처리하기

목은 통합 테스트만을 위한 것

  • 도메인 모델에 대한 테스트는 단위 테스트 범주에 속하며, 컨트롤러를 다루는 테스트는 통합 테스트다.
  • 목은 비관리 의존성에만 해당하며 컨트롤러만 이러한 의존성을 처리하는 코드이기 떄문에 통합 테스트에서 컨트롤러를 테스트할 때만 목을 적용해야 한다.

테스트당 목이 하나일 필요는 없음

  • 동작 단위를 검증하는 데 필요한 목의 수는 관계가 없다.
  • 통합 테스트에 사용할 목의 수를 통제할 수 없다.

호출 횟수 검증하기

  • 비관리 의존성과의 통신에 곤해서는 다음 두 가지 모두 확인하는 것이 중요하다.
    • 예상하지 호출이 있는가?
    • 예상치 못한 호출이 없는가?

보유 타입만 목으로 처리하기

  • 서드파티 라이브러리 위에 항상 어댑터를 작성하고 기본 타입 대산 해당 어댑터를 목으로 처리해야 한다.
    • 서드파티 코드의 작동 방식에 대해 깊이 이해하지 못하는 경우가 많다.
    • 해당 코드가 이미 내장 인터페이스를 제공하더라도 목으로 처리한 동작이 실제로 외부 라이브러리와 일치하는지 확인해야 하므로,해당 라이브러리를 목으로 처리하는 것은 위험하다.
    • 서드파티 코드의 기술 세부 사항까지는 꼭 필요하지 않기에 어댑터는 이를 추상화하고, 애플리케이션 관점에서 라이브러리와의 관계를 정의한다.
  • 이 지침은프로세스 내부의존성에 적용되지 않는다.
    • 따라서 인메모리 의존성이나 관리 의존성을 추상화할 필요가 없다.