티스토리 뷰

카테고리 없음

[TDD개발] Mocking 기준

ThisisEmma 2024. 12. 19. 15:55
반응형

테스트 코드를 작성할 때, 특히 단위테스트에서 주요 목표는 작업단위 (테스트 중인 메서드 또는 클래스)를 해당 종속성에서 분리하여 테스트가 테스트 중인 단위의 동작에만 초점을 맞추도록 하는 것입니다. 이를 달성하려면 어떤 객체를 mocking 할 것인지 결정해야 합니다. mocking 할 객체를 선택하는 기준에 대해서 알아봅시다.


1. External Dependencies

장치가 상호 작용하지만 핵심 논리의 일부가 아닌 외부 시스템이나 서비스를 나타내는 모의 개체입니다.

These could include:

  • Databases (e.g., repositories or DAOs).
  • External APIs (e.g., web services or REST clients).
  • Messaging systems (e.g., Kafka, RabbitMQ).
  • File systems (e.g., reading/writing files).

Why Mock?

  • 실제 네트워크 호출, 데이터베이스 연결 또는 I/O 작업을 방지합니다.
  • 테스트에서 자신의 행동과 반응을 제어합니다.

2. 비결정적 동작을 갖는 객체

테스트 중에 예측하거나 복제하기 어려운 동작을 가진 모의 개체입니다.

Examples include:

  • Timestamps (System.currentTimeMillis, LocalDateTime.now).
  • Random number generators.
  • Thread-related objects (e.g., scheduled tasks).

Why Mock?

  • 일관되고 예측 가능한 테스트 결과를 생성합니다.

3. 리소스 사용량이 많은 개체

시간이나 메모리와 같은 상당한 리소스를 소비하는 모의 개체입니다.

  • 복잡한 계산.
  • 장기 실행 프로세스.
  • 대규모 데이터 처리 작업.

Why Mock?

  • 테스트를 더 빠르고 효율적으로 만들기 위해.
  • 시스템 리소스의 불필요한 소비를 방지합니다.

4. 타사 라이브러리 또는 프레임워크

다음과 같은 외부 라이브러리 또는 프레임워크에서 제공되는 모의 개체

  • Logging libraries (e.g., SLF4J, Log4J).
  • ORM tools (e.g., Hibernate EntityManager).
  • Authentication and authorization frameworks.

Why Mock?

  • 테스트 중에 타사 코드에 대한 종속성을 방지합니다.
    라이브러리 자체를 테스트하지 않고 코드와 라이브러리의 상호 작용을 확인합니다.

5. Complex Collaborators

다음과 같이 복잡하거나 관련이 없는 논리를 사용하여 협력자를 나타내는 모의 객체입니다.

  • 테스트와 관련 없는 비즈니스 로직을 캡슐화하는 서비스입니다.
  • 직접 테스트되지 않은 애플리케이션의 기타 구성 요소입니다.

Why Mock?

  • 테스트 중인 장치를 격리하고 공동 작업자의 동작 테스트를 방지합니다.

6. 트리거하거나 제어하기 어려운 개체

특정 동작을 생성하기 위해 복잡한 조건이나 시나리오가 필요한 모의 개체입니다.

  • Error conditions (e.g., database connection failure).
  • Edge cases (e.g., API timeout or invalid responses).

Why Mock?

  • 재현하기 어려운 시나리오를 통제된 방식으로 시뮬레이션합니다.

7. 상호 작용을 확인해야 하는 개체

다음과 같이 관찰하려는 동작을 가진 모의 개체

  • 특정 메서드가 호출되었는지 확인합니다.
    올바른 매개변수가 전달되었는지 확인합니다.

Why Mock?

  • 테스트 중인 장치와 해당 종속성 간의 상호 작용을 확인합니다.

Objects You Should NOT Mock

While mocking is powerful, avoid mocking:

  • 테스트 중인 클래스: 테스트 중인 실제 클래스를 mocking 하면 단위 테스트의 목적이 무산됩니다.
  • 간단한 데이터 구조: DTO, POJO 또는 엔티티 등 그들의 가치를 직접 테스트합니다.
  • 내부 로직: 모의 로직을 생성하는 대신 실제 구현을 테스트합니다.
  • 동일 모듈 내의 종속성: 통합 또는 구성 요소 테스트를 사용하여 그룹으로 동작을 테스트하는 것을 선호합니다.

 

반응형