문서 업데이트: 2024-08-28

대역의 정의 []

뉴에이스 국어사전 -

어떠한 범위를 나타내는 대역이 아니라, 실제를 대신하는 그 대역이라고 합니다.
영어로는 double.

dou·ble | dʌ́bl | 【dou(2개로)+ble(쌓아 올리다)】
명사

3.꼭 닮은[흡사한] 사람[물건]; 망령, 유령

    ▸ meet one's double   
    자기와 꼭 닮은 사람을 만나다   
    ▸ He is his father's double.   
    그는 아버지와 꼭 닮았다.   

6.〔영화·연극〕 1인 2역의 배우; 대역; 대신.

뉴에이스 영한사전 / 뉴에이스 한영사전 -

테스트 대상이 의존하는 객체를 대신하는 객체,
의존하는 객체에 결합을 끊고 로직의 흐름을 확인하는 경우 많이 사용하는 테스트 대역.
그 종류에 대해 알게 되어 정리합니다.

스스로 오용한 테스트 대역 개념

이전까지

  • Mock(미리 준비해둔 값, 객체의 응답 값을 반환.),
  • Spy(실제 객체의 복사본으로, 실제 로직에 따라 동작)

로만 구분했지만,

목적에 따른 구분

도서 [자바/스프링 개발자를 위한 실용주의 프로그래밍 / 김우근 지음]를 읽은 후, 목적에 따라 아래와 같이 구분할 수 있음을 알았습니다.

  • Dummy: 아무 동작도 하지 않음.
    • 샌드백 같은 느낌. 동작이 없으니, 호출을 받는 용도로만 사용.
  • Stub: 특정 결과를 반환하도록 함. 실제 객체의 응답에 비슷, 동일하게.
    • (고정된 반환 값)
  • Fake: (실제 객체를 흉내낸) 고유의 로직을 가지고 있음. 해당 로직에 기반해 동작.
    • (로직에 따라 반환 값이 바뀜)
    • 의존 객체에 결합된 객체의 로직을 흉내내서, 실제처럼 동작하는 것을 목표로 함.
  • Mock: 메서드 호출 및 상호작용을 기록, 특정 동작이 수행되는지, 상호작용 하는 지에 초점.
    • 내부 구현이 가짜, dummy 처럼 행동.
    • 원한다면 stub도 가능
  • Spy: 실제 객체 처럼 동작함. 추가적으로 메서드가 몇 번 호출 됐는지, 매개변수는 뭐였는지, 호출 순서는 어떤지 모든 것을 기록.
    • 내부 구현이 실제 객체와 같음, 실제 로직대로 작동,
    • 일부 동작을 스텁 하도록 조작도 가능.

아주 잠깐 진행 중인 프로젝트에 적용 해보며

계층간에 인터페이스 없이 프레임워크에 의존하는 객체에 직접 의존하는 경우, 순수 자바 코드로 해당 객체를 테스트 대역으로 만들 때, 프레임워크가 상속하는 모든 메서드를 오버라이딩할 수밖에 없었습니다.

의존성 역전이 어떻게 계층간 결합을 끊어내는 지, 어떤 이점을 가져다 주는 지 이해가 되는 부분입니다.

Mockito

테스트 대역을 손쉽게 만드는 프레임워크.

인터페이스를 통한 의존성 역전, 결합 끊어내기에는 관리할 클래스가 늘어나는 단점이 있는데, 이 때 Mockito 를 이용하는 것이 이점을 가져다 준다고 느껴집니다.

마치며

  • 테스트 대역을 사용하면서도, 실제 구현체를 사용하는 (통합)테스트도 적절히 구성해서, 해당 테스트 대역이 적절하게 작동하는 지도 잘 확인 해봐야겠습니다.
  • Mockito 의 등장 배경을 본 것 같아 흥미로웠습니다.
  • 계층간 의존을 끊어내고, 기술에 의존도를 낮추는 것이 흥미롭습니다. 프로젝트에 적용해봐야겠습니다.

참고: 도서 [자바/스프링 개발자를 위한 실용주의 프로그래밍] / 김우근 지음