최상위 투표 답변에서 언급했듯이 Martin Fowler는 Mocks Are n't Stubs의 이러한 차이점 , 특히 Mocks와 Stubs의 차이점 소제목에 대해 설명 하므로 해당 기사를 읽으십시오.
이런 것들이 어떻게 다른지에 초점을 맞추기보다는 그것들이 왜 독특한 개념 인지 에 초점을 맞추는 것이 더 밝다고 생각합니다 . 각각 다른 목적으로 존재합니다.
가짜
가짜는 그 동작합니다 "자연"을 구현 한 것입니다 만, "진짜"아니다. 이것들은 희미한 개념이므로 다른 사람들은 사물을 가짜로 만드는 것에 대한 다른 이해를 가지고 있습니다.
가짜의 한 예는 메모리 내 데이터베이스입니다 (예 : :memory:
상점 과 함께 sqlite 사용 ). 데이터가 지속되지 않기 때문에 프로덕션에는이 기능을 사용하지 않지만 테스트 환경에서 사용하기에는 데이터베이스로 적합합니다. 또한 "실제"데이터베이스보다 훨씬 가볍습니다.
다른 예로, 프로덕션 환경에서는 일종의 객체 저장소 (예 : Amazon S3)를 사용하지만 테스트에서는 디스크의 파일에 객체를 간단히 저장할 수 있습니다. "디스크에 저장"구현은 가짜 일 것입니다. 또는 메모리 내 파일 시스템을 대신 사용하여 "디스크에 저장"작업을 가짜로 만들 수도 있습니다.
세 번째 예로 캐시 API를 제공하는 객체를 상상해보십시오. 올바른 인터페이스를 구현하지만 캐싱을 전혀 수행하지 않지만 항상 캐시 미스를 반환하는 객체는 일종의 가짜입니다.
가짜의 목적은 하지 테스트중인 시스템의 동작에 영향을 미치는 것이 아니라 할 구현 단순화 (불필요하거나 헤비급 종속성을 제거하여) 시험을.
스텁
스터브는 "비정상적"동작을 구현 한 것이다. 특정 출력으로 특정 입력에 응답하도록 미리 설정되어 있습니다 (보통 테스트 설정에 의해).
스텁의 목적은 테스트중인 시스템을 특정 상태로 만드는 것입니다. 예를 들어 REST API와 상호 작용하는 일부 코드에 대한 테스트를 작성하는 경우 항상 미리 준비된 응답을 리턴하거나 특정 오류로 API 요청에 응답하는 API로 REST API를 스텁 아웃 할 수 있습니다. 이렇게하면 시스템이 이러한 상태에 어떻게 반응하는지에 대한 주장을하는 테스트를 작성할 수 있습니다. 예를 들어, API가 404 오류를 반환하면 사용자가받는 응답을 테스트합니다.
스텁은 일반적으로 응답하도록 지시 한 정확한 상호 작용에만 응답하도록 구현됩니다. 그러나 스텁을 만드는 주요 기능은 그 목적입니다 . 스텁은 테스트 케이스 설정에 관한 것입니다.
목신
모의는 그루터기에, 그러나와 유사하다 검증 에 추가했다. 모의의 목적은 테스트중인 시스템이 종속성과 상호 작용하는 방법에 대한 주장을하는 것입니다 .
예를 들어 파일을 웹 사이트에 업로드하는 시스템에 대한 테스트를 작성하는 경우 파일을 허용하고 업로드 된 파일이 올바른지 확인하는 데 사용할 수 있는 모의 객체 를 작성할 수 있습니다. 또는 더 작은 규모로, 테스트 대상 시스템이 모의 오브젝트의 특정 메소드를 호출하는지 확인하기 위해 모의 오브젝트를 사용하는 것이 일반적입니다.
Mocks는 특정 테스트 방법론 인 상호 작용 테스트에 연결되어 있습니다. 시스템 상호 작용 보다는 시스템 상태 를 테스트하려는 사람들은 모의를 거의 사용하지 않을 것입니다.
테스트 복식
가짜, 스터브 및 모의는 모두 테스트 복식 카테고리에 속합니다 . 테스트 이중은 다른 것 대신 테스트에서 사용하는 모든 객체 또는 시스템 입니다. 대부분의 자동화 된 소프트웨어 테스트에는 어떤 종류의 테스트 복식을 사용하는 것이 포함됩니다. 다른 종류의 테스트 더블에는 더미 값 , 스파이 및 I / O 블랙홀이 포함 됩니다.