테스트 더블은 테스트 두번하는 건가?

반응형

TDD를 학습하다보면 테스트 더블이라는 말이 나온다. 그렇다면 테스트 더블은 테스트를 두번하는걸까?
gpt한테 물어보니 이 용어는 영화 용어에서 스턴트 더블에서 왔다고 한다.
그리고 찾아보니 더블이 두배라는 뜻이 있지만 대역이라는 뜻이 있다고 한다.
그럼 뜻을 다시 해석해보면 테스트를 하기 위해 대역을 쓰는거라고 이해하면 될거 같다.

요런 관점에서 생각을 해본다면
테스트 더블에는 총 5가지의 대역들이 존재한다.
mock, spy, stub, fake, dummy
요렇게 5가지가 있다고 한다.
이제 대역이라는 것을 바탕으로 생각을 해보면
mock은 구현에 대한 대역
spy는 구현에 대한 대역
stub은 값에 대한 대역
fake은 구현에 대한 대역
dummy는 값에 대한 대역

요렇게 나눌수 있을거다.
근데 이상한건 구현3에 값이2개다. 그럼 나는 그룹핑한것들을 똑같이 보고 있는걸까?
결론부터 말하면 전혀 아니다. 
구현대역인 mock, spy, fake에 대해 말해보자.
얘네의 가장 큰 차이점은 실제 코드를 동작을 시켜보냐의 차이다. 물론 이것도 대역이기 때문에 진짜로 동작이 되어지지는 않는다.
말하는 핵심은
mock같은 경우는 이렇게 동작할 테니, 이렇게 불렸는지도 꼭 체크해줘라는 뜻이고
spy는 진짜 코드 돌려볼 테니, 어떻게 호출됐는지도 기록해줘라는 뜻이구
fake는 실제는 몰라, 내가 만든 가짜 동작으로 테스트 해봐라는 거라 생각한다.

예시를 하나 말하면

@BeforeEach
void init() {
  //given
  userPoint = spy(UserPointTable.class);
  pointHistory = spy(PointHistoryTable.class);
  pointService = new PointService(userPoint, pointHistory, new PointPropertiesStub());
}

여기서 퀴즈를 내면 왜 spy를 사용했을까? mock으로 하면 안되는걸까?
결론부터 말하면 여기에서는 mock을 사용하면 안된다 그 이유는 mock은 구현 코드의 체킹이 목적이다. 그렇기 때문에
저 클래스이 유무가 중요하지 저 내부에서 어떻게 동작하는지는 관심이 없다. 즉. 생성자가 있다면 동작을 안한다는 뜻이고
밑에 값이 할당이 되지 않는다는 뜻이다.
코드를 확인해보니

private final Map<Long, UserPoint> table = new HashMap<>();

요런 코드가 있었다. 만약에 mock으로 했다면 이 코드는 동작할수 있을까?
이쯤에서 왜 fake에 대해서는 말을 안하는지에 대해 의문을 품을 수 있다.
fake같은 경우는 [암튼 이러한 동작을 할거니까] 를 테스트용으로 만들어야 하는데  하기에는 너무 복잡하다고 생각하다. 그렇다고 불가능한건 아니지만 굳이 할필요가 있는지는 잘모르겠다.

다음은 값에 대한 대역으로 stub이랑 dummy를 들었다.
이둘은 위 세개와 다르게 비슷하다고 볼수 있으며 거의 똑같다고 생각한다.
왜냐하면 stub같은 경우 이거는 이값으로 세팅을 해달라는 걸로 이해하면 되구
더미는 그냥 데이터 세팅을 해놓은거라 생각하면 된다.
어떻게 보면 싱글이냐 데이터냐 차이라고 봐도 크게 이상하지는 않는다고 생각한다.

그리고 요건

public class PointPropertiesStub extends PointProperties {
  @Override
  public long getAvailableCharge() {
    return 10000L;
  }

  @Override
  public long getMaxSingleChargeAmount() {
    return 2000L;
  }


  @Override
  public long getMinSingleChargeAmount() {
    return 0L;
  }
}

내가 프로퍼티를 stub으로 만들었다.
그니까 프로퍼티들이 들어오면 저값으로 세팅이 되어진다는거구
만약 저걸 더미로 만들고 싶다면 클래스로 만드는것이 아닌 json형태로 만들어서 넘기는 형태로 변경이 되어야 할거다.

 

댓글

Designed by JB FACTORY