테스트코드/개요

9. 목 처리에 대한 모범 사례

feel2 2024. 3. 25. 20:20
반응형

목의 가치를 극대화하기

 

비관리 의존성에만 목을 사용하는 것은 목의 가치를 극대화 하는 첫번째 단계일 뿐이다.

목을 사용할 때는 꼭 **시스템 끝에서 비관리 의존성과의 상호 작용**을 검증하라!!

 

 

IBus 는 시스템 끝에 있다. IMessgeBus는 컨트롤러와 메시지 버스 타입 사슬에서 중간 고리일 뿐이다. IMessageBus 대신 IBus를 목으로 처리하면 회귀 방지가 좋아진다.

 

목 처리에 대한 모범 사례

 

  • 비관리 의존성(외부 시스템)에만 목 적용하기
  • 시스템 끝에 있는 의존성에 대해 상호 작용 검증하기
  • 목은 통합 테스트만을 위한 것이다.
    • 도메인 모델(persistance Layer) 은 단위 테스트 범주에 속하고, 컨트롤러를 다루는 테스트(presentation Layer)는 통합 테스트다.
  • 테스트당 목이 하나일 필요는 없다.
    • 호출 횟수 검증하기
      • 예상하는 호출이 있는가?
      • 예상치 못한 호출이 있는가?
messageBusMock.Verfiy(x => x.SendEmailChangeMessage(user.UserId, "new@gmail.com"));
 // 메시지를 전송하는지 확인하는 것만으로 충분하지 않다.
 
 // 아래와 같이 메시지가 정확히 한 번만 전송되는지 확인해야 한다.
 messageBusMock.Verfiy(x => x.SendEmailChangeMessage(user.UserId, "new@gmail.com"), Times.Once);  // <- 해당 메서드를 한 번만 호출하는지 확인

 

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

 

서드파티 라이브러리 위에 항상 어댑터를 작성하고, 기본 타입 대신 해당 어댑터를 목으로 처리해야 한다.

  • 서드파티 코드의 작동 방식에 대해 깊이 이해하지 못한 경우가 많다.
  • 서드파티 코드의 기술 세부 사항까지는 꼭 필요하지 않기에 어댑터는 이를 추상화하고, 애플리케이션 관점에서 라이브러리와의 관계를 정의한다.

실제로 어댑터는 코드와 외부 환경 사이에 손상 방지 계층으로 작동한다.

  • 기본 라이브러리의 복잡성을 추상화하고
  • 라이브러리에서 필요한 기능만 노출하며
  • 프로젝트 도메인 언어를 사용해 수행할 수 있다.
  • 또한 이렇게 추상 계층을 중간에 둠으로써 이러한 파급 효과를 하나의 클래스(어댑터)로 제한할 수 있다.

 

참조

  • 단위테스트(블라디미르 크리코프)
반응형