[TIL] Mocks aren't stubs

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

    마틴 파울러의 Mocks Arent Stubs는 테스트 더블 개념을 중심으로, Mock과 Stub의 차이점과 그 의미를 설명하는 글이다.

테스트 더블

테스트 더블(Test Doubles)은 테스트를 위해 실제 객체를 대신하는 객체로, 이를 통해 실제 객체를 대체하거나 보완할 수 있다.

테스트 더블에는 다섯 가지의 타입이 있다.

  1. Dummy 실제 사용되지 않지만, 메서드의 인자를 채우기 위해 사용되는 객체
  2. Stub 사전 정의된 응답을 리턴하는 객체, 보통 테스트를 위한 예상 결과를 제공
  3. Spy 호출된 메서드와 그 인자를 기록하는 객체
  4. Mock 테스트의 기대 행동을 정의하고, 테스트 중에 그 기대가 충족되는지 확인하는 객체
  5. Fake 실제 시스템의 일부와 동일하게 동작하지만, 간단하거나 다른 방법으로 구현된 객체

Stub

스텁은 테스트 대상이 되는 객체에 미리 정의된 응답을 반환하여 특정 상황을 시뮬레이션할 때 사용된다.

스텁은 테스트의 내부 구현에 따라 사용되며, 외부와의 상호작용이 중요한 경우가 아니다.

Mock

Mock은 특정 메서드가 호출되었는지, 호출된 횟수와 인자가 예상된 것인지 등을 확인하는 데에 중점을 둔다.

Mock은 행위 기반의 테스트를 지원하며, 주로 외부 의존성과의 상호작용을 검증하는 데에 사용된다.

스텁은 상태 기반의 테스트를 위한 반면, Mock은 행위 기반의 테스트에 중점을 둔다.

행위 기반 테스트와 상태 기반 테스트

  • 상태 기반 테스트 : 객체의 상태나 리턴값을 검사하여 테스트를 검증
  • 행위 기반 테스트 : 객체의 동작이나 상호작용을 검증, 여기서 Mock이 중요한 역할을 하게 된다.

테스트 설계에서의 고려사항

  • 유연성 Mock은 테스트를 더 유연하게 만들 수 있지만, 테스트 코드의 유지보수 성을 어렵게 할 수도 있다.
  • 복잡성 Mock을 과도하게 사용하면 테스트가 지나치게 복잡해지고, 실제 객체 간의 의존성을 간과할 위험이 있다.
  • 균형 상태 기반 테스트와 행위 기반 테스트를 적절히 조화롭게 사용하여 테스트 목적에 맞는 적절한 테스트 설계를 해야한다.

결론

  • 테스트 더블의 활용 : 다양한 테스트 더블의 특성을 이해하고, 상황에 맞는 테스트 더블을 선택하여 사용해야할 것
  • Mock과 스텁의 차이 : 스텁은 사전 정의된 응답을 리턴하는 반면, Mock은 특정 행동이 발생했는지 확인하는 역할을 하고, 두 개념의 차이를 명확히 이해하고 상황에 맞게 사용하는 것이 중요하다.