Java & Spring/기타

@SpyBean vs @MockBean

Zin0_0 2021. 10. 11. 15:44
반응형

SpyBean vs MockBean

  • SpringBoot 1.4 부터 추가된 Annotation

SpyBean

  • 클래스 레벨, @Configuration 클래스의 필드, @RunWith 클래스의 필드에 적용 가능 가능
  • 같은 컨텍스트 안의 빈은 spy로 선언된 빈으로 래핑된다.
  • Given에서 선언한 코드 외에 전부 실체 객체를 사용
    • @SpyBean
      private MyService myService;
      
      doReturn(myObject)
          .when(myService)
          .getMyObject(params..);
    • myService의 getMyObject라는 메소드는 위에서 정한 parameter로 호출할 때, myObject라는 객체를 리턴해주도록 설정해준다.
      이외의 모든 메소드, 필드 등은 실체 객체를 사용하게 된다.
  • 특정 기능만을 변경해서 테스트에 사용하고 싶은 경우, @SpyBean을 활용하면 된다.
  • 주의사항
    • 단위 테스트에서 @SpyBean을 통해 테스트하려는 경우, 테스트 범위가 너무 커지고 통합테스트와 다름 없는 테스트가 되지 않는지 먼저 확인한다.
      • 특정 단위만 테스트하면 되는 경우에는 Mock으로 구현하는 것이 더욱 효율적

MockBean

  • Spring ApplicationContext에 mock을 추가하는 Annotation
  • 클래스 레벨, @Configuration 클래스의 필드, @RunWith 클래스의 필드에 적용 가능
  • 컨텍스트에 정의된 기존의 동일한 타입 빈은 MockBean으로 대체
  • Mock = 껍데기만 있는 객체
  • MockBean은 기존에 사용되던 Bean의 껍데기만 가져오고 내부의 구현은 사용자에게 위임한 형태
    • 즉, Bean의 어떤 메소드에 어떤 값이 들어왔을 때, 어떤 값이 리턴되어야 할지를 테스트를 작성하는 개발자가 조작하여야 함
    • 기존에 사용되던 스프링 Bean이 아닌 Mock Bean을 주입
    • @MockBean
      private MyService myService;
      
      given(myService.getMyObject(params..))
          .willReturn(myObject);
  • given에서 선언한 코드 외에는 전부 사용할 수 없음.
  • given
    • 해당 Mock Bean이 어떤 행동을 취하면 어떤 결과를 반환한다를 선언

Reference

반응형