Java Mocking

song yuheon·2023년 9월 23일
0

Java

목록 보기
38/46
post-thumbnail

Mocking이란?

Mocking은 테스트 시, 외부 의존성이나 실제 객체를 가짜 객체(mock)로 대체하여 코드의 특정 부분만을 검증하는 방법이다.
Mockito 같은 라이브러리는 이를 쉽게 구현할 수 있게 도와준다.


Mocking의 주요 이점

  1. 속도
    실제 시스템과의 상호작용 없이 빠르게 테스트 실행 가능
  2. 의존성 분리
    테스트 대상 코드 로직의 격리 효과
  3. 제어 용이성
    예외나 특별한 상황의 시뮬레이션 용이하다

과도한 Mocking의 위험성

  1. 실제 동작 미검증
    실제 환경에서의 이슈 탐지 어려움

  2. 유지보수 어려움
    로직 변경시 mock 동작도 수정 필요

  3. 테스트 코드의 복잡성 증가


모킹을 통한 행위테스트 vs 상태 테스트

테스트는 주로 시스템이나 코드의 정확성과 안정성을 검증하기 위해 사용된다.
그 과정에서 "시스템이 어떻게 동작하는지"를 검증하는 행위 테스트와 "시스템이 무슨 결과를 내놓는지"를 검증하는 상태 테스트로 구분될 수 있다.


1. 행위 테스트

  • 정의
    코드나 객체가 특정 조건에서 예상되는 방식으로 동작하는지 검증한다.
  • 핵심
    "시스템이 어떻게 동작하는지"에 집중한다
  • 도구
    모킹 라이브러리(Mockito, EasyMock 등등)를 사용하여 의존성을 mock 객체로 대체하고, 그 mock의 행위를 검증한다

2. 상태 테스트

  • 정의
    코드나 객체의 실행 결과가 예상대로 변경되는지 확인한다.
  • 핵심
    "시스템이 무슨 결과를 내놓는지"에 집중한다.
  • 도구
    기대값과 실제 결과값을 비교하는 단언(assertion) 도구 (JUnit, TestNG의 assert 메서드 등)

차이점

  1. 의존성
    행위 테스트는 모킹 도구를 활용하여 의존성을 제거하거나 대체하면서 코드의 동작을 검증하게 된다.
    상태 테스트는 그러한 의존성 제거에 덜 집중하며 결과값에 초점을 맞춘다.

  2. 결합도
    행위 테스트는 때때로 내부 구현에 강하게 결합될 수 있다.
    이는 리팩토링 시 테스트가 깨질 위험을 높이게 된다.
    상태 테스트는 내부 로직보다는 외부 결과에 집중하기 때문에 이러한 문제가 상대적으로 적다.

  3. 테스트의 목적
    코드의 핵심 로직이나 알고리즘이 올바르게 동작하는지 확인하기 위해서는 상태 테스트가 더 적합할 수 있다.
    반면 시스템 간의 상호작용이나 사이드 이펙트를 검증하려면 행위 테스트가 필요하다.

  4. 테스트의 복잡성
    행위 테스트는 복잡한 시나리오나 다양한 사이드 이펙트를 갖는 코드에서 특히 유용하다.
    상태 테스트는 간단하고 명확한 결과 검증에 더 초점을 맞추게 된다.


Mocking의 적절한 활용 가이드

  1. 비즈니스 로직 중심의 단위 테스트
    외부 시스템과의 상호작용 최소화
  2. 통합 테스트 실시
    mock 최소화, 실제 컴포넌트 상호작용 검증
  3. 의존성 판단
    안정적인 의존성은 실제 인스턴스로 테스트 그렇지 않다면 mock 활용

사용 예시



profile
backend_Devloper

0개의 댓글