안녕하세요,
송아지할때 송아 김송아입니다.
아마 이 글에 들어오셨다면, @MockBean과 @SpyBean의 차이점이 궁금하실 것 같아서!
코드 보다는 개념과 의미에 집중해서 설명드리도록 하겠습니다.
글이 짧으니 천천히 차근차근 읽어보셔요!!
💡 참고로 이 글은 2023년 11월에 오프라인으로 출강을 했던 스프링 강의 중 질문 주신 내용을 바탕으로 작성되었습니다.
보고 계시죠?! 🥹 개념을 이해하시는 데에, 도움이 되셨으면 좋겠습니다!!
MockBean과 SpyBean의 차이점을 설명드리기 위해 먼저 MockBean의 개념부터 알아보겠습니다.
🚀 @MockBean
쉽게 말해서 껍데기만 있는 객체를 말합니다.
구현 코드에서 스프링이 관리하는 스프링 빈(Bean)의 껍데기만 사용하는 것이고, 안은 텅텅~ 비어있습니다.
자바에서 상속으로 비유 해보자면,
✔️ 부모 클래스의 ✨모든 메소드✨를 Override해서 재구현 해야 사용할 수 있는 상황으로 볼 수 있습니다.
즉, 상속이라기 보단 '텅텅 빈 인터페이스를 implements 한다' 라고 표현하는 것이 맞겠네요!
✔️ 만약 Override 하지 않는 다면, 그 기능은 사용할 수 없는 것이죠.
어떤 메소드 실행을 요구하면, 어떤 값을 반환할지
구현 코드 내용은 전체 무시하고, 테스트 코드에서 새롭게 짜는 것을 말합니다.
어디서 새롭게 짜냐구요?
바로, given - when - then 패턴에서 given 파트입니다.
- given : 테스트 코드를 수행하기 위한, 객체 기능을 "모~두" 정의하는 단계
- when : 정의한 객체를 테스트(사용)하는 단계
- then : 테스트(사용) 결과가 맞는지 검증하는 단계
이번엔 SpyBean입니다.
🚀 @SpyBean
다른 어노테이션인 SpyBean은, 테스트 코드에서 말 그대로 스파이 역할을 하는 MockBean입니다.
자바에서 상속으로 비유 해보자면,
✔️ 부모 클래스의 메소드 중 🔥일부만 Override해서 재구현🔥하고 나머지는 부모 클래스의 메소드를 그대로 쓰는 상황입니다.
given-when-then 패턴으로 비교해보자면,
given 부분에서
🤔 MockBean : 테스트 코드에 사용될 객체의 기능들을 선언할 때 전체 덮어쓰기를 하냐
🤔 SpyBean : 부분 덮어쓰기를 하고 나머지 기능은 스프링 빈 구현 기능을 그대로 사용하는 것의 차이인 것이죠.
정리해볼까요?
MockBean과 SpyBean의 대표적인 차이점은 다음과 같습니다.
@MockBean은
테스트코드에서 스프링빈의 구현 기능을 몽땅 덮어써서 쓰는 객체라면
@SpyBean은 테스트 코드에서 스프링빈의 구현 기능을 일부만 덮어쓰고,
덮어쓰지 않은 기능은 스프링빈 기능을 그대로 사용하는 객체
이미 현업에서 유려하게 사용하고 계실 것 같아서 (또는 이미 코드에서 쓰고 계신 멋진 개발자 지망생분들이실 것 같아서)
코드보다는 차이점 설명을 최대한 이해가 쉽도록 표현해봤습니다😊
ps. 혹시 코드가 필요하시다면, 개인적으로 아래 블로그가 정리를 잘 해두신 것 같아 추천 드려봅니다.
이 글을 읽으시는 모~든 분들!
읽어보시고 언제든 추가 설명이 필요하시다면 댓글로 알려주세요 😊
조금이라도 도움이 될 수 있다면, 저는 글 쓰는 맛이 나버리지요..💚
감사합니다!
모두 따뜻한 연말 되세요.
김송아 드림
아니 근데 끄기 전에 잠깐,
옆집 사는 김송아가 유데미 강의를 냈다고?
옆집 개발자 지금 구경가기 👇🏻
'Web' 카테고리의 다른 글
[언그래머] 쉰두번째 아티클_나에게 데브옵스(DevOps)란..? (26) | 2023.12.19 |
---|---|
[언그래머] 쉰한번째 아티클_서버리스는 진짜 서버가 없는 걸까? (22) | 2023.12.15 |
Spring boot gradle - filter 등록(적용) 및 특정 URL 제외 (4) | 2023.12.05 |
스프링부트 사라진 2.x (2점대) 버전을 찾아서.. (알집 있음) (1) | 2023.12.05 |
11/23~24 저와 함께 스프링 공부하신 멋진 분들께 (1) | 2023.12.05 |