ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mockito의 Mock, Stub, Spy
    웹 개발 2025. 3. 30. 21:35
    테스트할 때 이용되는 Mockito의 간단 개념을 다른 Java Mock 라이브러리와 비교해서 설명하고, Mockito의 Mock, Stub, Spy 개념을 정리한 글입니다. 

     



    Mockito란?

     

    Mockito의 Features And Motivations 문서 내용

     

     

    Mockito는 모의 객체(Mock)을 만드는 라이브러리 중 하나입니다.

    Java Mocking 분야에는 EasyMock, jMock 같은 expect-run-verify(예상-실행-검증)방식을 따르는 라이브러리가 있습니다.

     

    EasyMock 은 expect 단계에서 "이 메소드는 n번 호출되어야 한다.", "이 메소드는 호출 후에 특정 값이 반환되어야 한다." 와 같은 예상안을 작성해두고, verify 단계에서 expect 단계에 작성해둔 예상안을 한 번에 검증합니다.

    반면 Mockito 는 expect 라는 개념 자체를 없애고, verify 단계에서만 특정 메소드에 예상안을 작성, 검증합니다.

     

    EasyMock 이 예상(expect)하지 못헀던 호출에 대해 에러를 일으키는 반면, Mockito 는 명시하지 않은 호출에 대한 검증verify은 무시합니다.

     

    즉, Mockito는 Mock 테스트의 메커니즘을 "모든 것을 미리 예상하고 모두 검증하는 방식"에서 "필요한 것만 지정하고 필요한 것만 검증하는 방식"으로 개선시킨 겁니다. 이런 설계 철학으로 인해 Mockito 는 더 간결하고 유연한 테스트 코드 작성이 가능하게 됐습니다. 그렇기에 문서에서도 매우 슬림한 API 를 가지고 있다고 표현합니다.

     


    Mockito의 Stub,  Mock, Spy 개념

    Stub

    상태 검증(state verification)

    특정 메서드 호출에 대해 미리 정의된 결과를 반환합니다. 단순 가짜 객체를 반환하며, 호출 자체를 검증하지 않습니다.

    mockito 에서는 해당 과정이 실행 전에 작성되어야 한다고 명시하고 있습니다.

     

    특정 시나리오나 상태를 시뮬레이션해야 할 때, 테스트하려는 코드가 특정 반환 값에 의존할 때 등의 상황에 사용합니다.

     

    더 구체적인 예시를 작성하자면, OrderService 의 로직을 검증하고 싶은 상황에서, 모의 객체로 생성해둔 OrderRepository의 findById() 메서드를 호출했을 때 User1 을 반환해야 OrderService 를 검증하기 용이할 때 이용됩니다.

     

    Mock 

    행위 검증(behavior verification)

    어떤 메서드가 몇 번 호출되었는지, 어떤 파라미터로 호출됐는지 검증합니다.

    넓은 의미의 Mock(모의 객체)와 검증의 개념인 Mock 이 있습니다.

     

    실행이 끝난 후 검증할 때 사용합니다.

     

    더 구체적인 예시를 작성하자면, OrderService 로직의 save() 메서드가 몇 번 호출되었는지, OrderService 로직에서 findBy() 메서드가 1L 이라는 파라미터를 받았는지 등의 검증을 통해 개발자가 검증하고자 했던 요소를 검증할 수 있습니다.

     

    Spy

    실제 객체의 일부 메소드는 실행시키고, 일부는 모의로 동작할 수 있도록 지정하는 방식입니다. 특정 메소드만 Stubbing 하고 그 이외 메소드는 실제 동작을 확인할 수 있게 합니다.

     

    예시를 들자면,

    이 Repository 에서 findById() 는 원래 객체의 동작을 그대로 유지하고 싶은데, save()는 실제로 실행되지 않도록 처리하고 싶어졌습니다. 이때 Spy 개념을 이용하는 것입니다. 실제 객체인 Repository realRepo를 선언하고, spyRepo = spy(realRepo) 를 통해 Spy 객체를 만들어 spyRepo.findById() 는 실제 메소드를 실행시키고, save() 메서드는 Stubbing 처리할 수 있게 합니다.

     


    Features And Motivations

Designed by Tistory.