HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
Java
Java
/
🕚
Test Double
🕚

Test Double

[우테코 리뷰 블로그 Javable] Test Double을 알아보자
notion image
💡
테스트가 수행될 수 있도록 의존 오브젝트에서 테스트 대상 오브젝트로 넘겨줄 값을 제공해주는 스텁. 의존 오브젝트에게 넘겨주는 값까지 확인이 가능한 목 오브젝트 차이점 한줄 요약 : Stub 은 테스트 대상 오브젝트의 메서드를 테스트할 수 있도록 의존 오브젝트에 입,출력값을 제공하고 제공받도록 함 Mock 은 거기에 더해서 테스트 대상 오브젝트와 의존 오브젝트 사이의 커뮤니케이션 내용을 저장해두었다가 테스트 결과 검증에 활용할 수 있음
  • #테스트 오브젝트, #의존 오브젝트
  • 테스트 환경을 만들어주기 위해, 테스트 오브젝트의 기능에만 충실하게 수행하면서 빠르게, 자주 테스트를 실행할 수 있도록 사용하는 오브젝트를 통틀어서 테스트 대역(test double)이라 부름
    • 테스트가 수행될 수 있도록 의존 오브젝트에 간접적으로 입력 값을 제공해주는 Stub
    • 간접적인 출력 값까지 확인이 가능한 Mock

Stub

  • 테스트 스텁은 테스트 대상 오브젝트의 의존객체로서 존재하면서 테스트 동안에 코드가 정상적으로 수행할 수 있도록 돕는 것을 말함
    • 많은 경우, 테스트 스텁이 결과를 돌려줘야 할 때도 있음. 호출만 하면 그만인 것도 있지만(예: MailSender) 리턴 값이 있는 메서드를 이용하는 경우에는 결과가 필요함
    • 이럴 땐 스텁에 미리 테스트 중에 필요한 정보를 리턴해주도록 만들 수 있음
    • 또는 어떤 스텁은 메소드를 호출하면 강제로 예외를 발생시키게 해서 테스트 대상 오브젝트가 예외상황에서 어떻게 반응할지를 테스트할 때 적용할 수도 있음

Mock

  • 테스트 대상 오브젝트의 메소드가 돌려주는 결과뿐 아니라 테스트 오브젝트가 간접적으로 의존 오브젝트에 넘기는 값과 그 행위 자체에 대해서도 검증하고 싶다면, 목 오브젝트(mock object)를 이용
    • Mock : 테스트 대상의 간접적인 출력 결과를 검증하고, 테스트 대상 오브젝트와 의존 오브젝트 사이에서 일어나는 일을 검증할 수 있도록 특별히 설계
    • 목 오브젝트는 스텁처럼 테스트 오브젝트가 정상적으로 실행되도록 도와주면서, 테스트 오브젝트와 자신의 사이에서 일어나는 커뮤니케이션 내용을 저장해뒀다가 테스트 결과를 검증하는 데 활용할 수 있게 해줌
    • 보통의 테스트 방법으로는 검증하기가 매우 까다로운 테스트 대상 오브젝트의 내부에서 일어나는 일이나 다른 오브젝트 사이에서 주고받는 정보까지 검증하는 일이 손쉬워짐

Stub vs Mock

 
(5)번을 제외하면 스텁이라고 봐도 됨.
(5)번을 제외하면 스텁이라고 봐도 됨.
  • 테스트 대상은 의존 오브젝트에게 값을 넘겨주기도 하고 값을 넘겨받기도 한다.
  • 의존오브젝트에게 넘겨주는 값은 무시한다고 칠 수 있지만, 간접적으로 테스트 대상이 넘겨 받아야 할 값은 필요함
    • →이 때 별도로 준비해둔 스텁 오브젝트가 메소드 호출 시 특정 값을 리턴하도록 만들어줌
 
  • 떄로는 테스트 대상 오브젝트가 의존 오브젝트에게 넘겨준 값에 관심이 있을 경우가 있다.
  • 혹은, 의존 오브젝트를 얼마나 사용했는가 하는 커뮤니케이션 행위 자체에 관심이 있을 수가 있다.
  • 문제는 이 정보는 테스트에서는 직접 알 수가 없다는 점.
    • ⇒ 이 때, 테스트 대상과 의존 오브젝트 사이에 주고 받는 정보를 보존해두는 기능을 가진 테스트용 의존 오브젝트인 목 오브젝트를 만들어서 사용해야 한다.
    • 테스트 대상 오브젝트의 메소드 호출이 끝나고 나면 테스트는 목 오브젝트에게 테스트 대상과 목 오브젝트 사이에서 일어났던 일에 대해 확인을 요청해서, 그것을 테스트 검증 자료로 삼을 수 있음
 
  • 상태 검증 : 메서드가 수행된 후, 객체의 상태를 확인하여 올바르게 동작 했는지를 확인하는 검증법임
  • 행위 검증 : 메소드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는 지 확인하는 검증법임

Stub 과 Mock 구현 예시

static class MockMailSender implements MailSender { private List<String> requests = new ArrayList<String>(); public List<String> getRequests() { return requests; } public void send(SimpleMailMessage mailMessage) throws MailException { requests.add(mailMessage.getTo()[0]); } public void send(SimpleMailMessage[] mailMessage) throws MailException { } }
메서드 호출 시의 파라미터를 저장해둠. 커뮤니케이션 내용을 저장해둠
 
public class DummyMailSender implements MailSender { public void send(SimpleMailMessage mailMessage) throws MailException { } public void send(SimpleMailMessage[] mailMessage) throws MailException { } }
아무런 기능이 없는 MailSender 구현 클래스 (Stub)