spring boot/기술 적용

stub, mock, spy 비교

ballde 2022. 7. 2. 17:54

배경

솔직히 테스트 코드를 짜오면서 정확한 차이들을 모르고 있었다는 생각이 들어서 정리를 해보려고 합니다.

원문

https://martinfowler.com/articles/mocksArentStubs.html

 

Mocks Aren't Stubs

Explaining the difference between Mock Objects and Stubs (together with other forms of Test Double). Also the difference between classical and mockist styles of unit testing.

martinfowler.com

test double

Meszaros는 테스트 목적으로 실제 개체 대신 사용되는 모든 종류의 가상 개체에 대한 일반 용어로 Test Double 이라는 용어를 사용합니다. 이름은 영화에서 스턴트 더블의 개념에서 비롯됩니다.Meszaros는 5가지 특정 종류의 이중성을 정의했습니다.

Dummy

전달되지만 실제로는 사용되지 않습니다. 일반적으로 매개변수 목록을 채우는 데만 사용합니다.

Fake

일의 능률을 향상시켜주지만 일반적으로 프로덕션에 적합하지 않습니다. (in memory가 좋은 예임)

Stub

테스트 할 동안 준비된 대답을 제공해줍니다. 테스트를 위해 프로그래밍 된 것 외에는 응답하지 않습니다.

Spies

어떻게 부름을 받았는지에 따라 일부 정보를 기록하는 stub 입니다. 전송된 메세지 수를 기록하는 이메일 서비스가 한 예시 입니다.

Mocks

수신할 것으로 예상되는 호출의 사양을 형성하는 기대값으로 미리 프로그래밍된 객체입니다.

언제 stub을 쓰고 언제 mock을 써야하나?

  • Stub (상태 검증)
    • 테스트 입력에 집중
      • 그 입력값에 따라 리턴하는 결과값을 비교하는지?
      • 그 입력값에 따라 exception이 발생하는지?
    • 협력객체의 특정 부분이 테스트하기 힘들 경우 stub을 사용하면 수월하게 테스트할 수 있다
    • 일반적으로 우리가 mock으로 잘못 알고있다 - (테스트 코드 이름을 지을 때 차이를 몰라 mock이라고 했었다. ㅠ)
  • mock (행동 검증)
    • 테스트의 출력/결과가 올바른가?

 

다음에는 kotlin으로 stub, mock 테스트 코드(kotest, mockk?)를 짜볼 계획입니다.

 

 

출처

https://luran.me/343

 

testing - stub, mock, spy 차이는?

stub, mock, spy의 차이는? 테스트 코드를 작성하다 보면, 한동안 Stub과 Mock의 차이를 생각하지 않고 써왔던 것 같다. Martin Fowler의 원본 글을 읽어보면서 내용을 정리해둬야 나중에 방향성을 잡을 때

luran.me