Mocking 관련
713
8 asked
안녕하세요, 강의에서는 'Integration' Test 를 짠걸로 보이는데요.
실제 작업하실때 Mocking 해서 서비스함수 테스트를 짜시지는 않는지 궁금합니다.
우리가 쓴 테스트가 'Unit' 테스트가 되려면 Mocking 을 해야할 것 같은데 혹시 Mocking 을 하는 것과 테스트 코드를 짜는 방식에 대해서 어떻게 선호하시는지 궁금합니다.
Answer 2
3
안녕하세요, Tony님!!! 크으~~ 너무 너무 좋은 질문이십니다..!!!!! Tony님께서도 아시다시피 이 주제가 굉장히 어렵고 사람마다 의견 역시 많이 다를 수 있는 부분이라 생각합니다! (https://www.inflearn.com/questions/624844 와 같은 이야기도 있었습니다!!)
우선 질문 주신 내용에 대한 답변을 먼저 드려보고 배경을 조금 더 말씀드려 보겠습니다! 😊
[답변]
작업하실 때 Mocking해서 서비스 함수 테스트를 작성하시나요?!
저는 서비스 함수 테스트를 작성할 때 되도록이면 Mocking을 하지 않습니다!
저는 런던파 고전파 중 고전파에 가깝고, '리팩토링 내성'을 중요하게 생각하기 때문이에요!
물론 외부 API 호출을 한다거나 FS와의 연동이 필요하다거나 하는 경우 즉, Mocking이 반드시 필요한 경우에는 mockk를 활용해서 Mocking을 사용합니다 ㅎㅎㅎ
우리가 쓴 테스트가 'Unit' 테스트가 되려면 Mocking 을 해야할 것 같은데 혹시 Mocking 을 하는 것과 테스트 코드를 짜는 방식에 대해서 어떻게 선호하시는지 궁금합니다.
위의 답변에서 눈치채셨겠지만, 저는 강의에서 작성된 방식과 동일하게 테스트 작성 하는 것을 선호합니다~!!!
그리고 'Unit' 테스트 라고 표현을 해주셨는데요!! 저도 엄밀하게는 강의에서 작성된 테스트가 'Integrate' 테스트라고 생각합니다! 다만, 특정한 단일 기능을 테스트 한다는 의미에서는 단일 테스트라고 표현할 수 있지 않을까 매우 개인적으로 생각합니다 ㅎㅎㅎㅎ (마치 저희가 속도와 속력을 구분하지 않는 것처럼요!)
또한 강의에서 작성된 테스트 코드가 'Unit Test'가 아닌 이유는 Tony님과 제가 다르게 생각하고 있을거에요!!
감히 추측해보자면, Tony님께서는 Service 그 자체만 테스트 하지 않고, 협력하는 객체(ex. Repository)의 기능까지 테스트 코드에서 실행되기 때문에 'Integrated Test'라고 표현해주셨을 것 같습니다!
반면 저는 고전파 입장에서 이 테스트가 단일 동작 단위를 검증하고, (가능한) 빠르게 수행되지는 것 까지는 맞지만 H2라는 공유 의존성을 가지고 있는 한계로 다른 테스트와 동시에 수행될 수 없어 'Integrated Test'라고 생각하고 있습니다!!
[배경]
고전파, 런던파, 좋은 단위 테스트를 구성하는 요소는 무엇인지에 대한 내용은 제 블로그에 예전에 <단위 테스트> 라는 책을 읽으며 정리한 적이 있어 공유드립니다!!
고전파와 런던파 - https://lannstark.tistory.com/227
좋은 단위 테스트의 4대 요소 - https://lannstark.tistory.com/224
다시 한 번 강조드리지만, 정답이 없는 문제라고 생각합니다!! 😊 다만 저는 계층간의 mocking을 사용한 테스트가 많이 존재하는 환경에서 새로운 Business 요구사항을 구현할 때 테스트 코드까지 영향범위가 퍼져 개발 속도가 느려지는 경험을 많이 했었고, mocking을 하지 않는다는 제약조건에서 Testable한 프로덕트 구조가 나오는 경험을 했어서 고전파 쪽으로 기운것 같습니다 ㅎㅎㅎㅎ
혹시나 더 궁금한 점 있으시다면 편하게 말씀해주세요!!! 감사합니다~!! 🙏🙏
2
좋은 답변 감사합니다.
사실 실무에서 서비스에 주입되는 repository를 mocking 해서 테스트를 짰을때 실리를 많이 느끼지 못해서 매번 프로젝트 셋업이나 피쳐 개발때 어떻게 테스트 코드를 운영할까 고민을 했는데 태현님 답변이 좋은 가이드가 된 것 같습니다.
아직 테스트코드 경험이 미천하다보니 내 판단을 믿기 어려워 항상 개발하시는 분들께 물어보는 주제인 것 같습니다 ㅎㅎ
0
아유~ 아닙니다~~ 미천한 경험은 없습니다~~ 다양한 방식으로 다 도움이 되더라고요~~
이 부분이 정말 어려운 주제라 저도 공부할 내용이 정말 많아요!! 😊😊
약간의 가이드가 될 수 있어 정말 다행이네요!! 언제든지 편하게 질문 남겨주세요~!!
감사합니다 ㅎㅎㅎㅎ
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
0
68
2
실행이 안되네요
0
66
2
프론트 영역 보는법
0
51
2
companion object
0
78
2
Custom 레프직토리 형식
0
57
2
Querydsl 도입
0
67
2
fetch join DISTINCT 중복제거
1
83
2
표준 예외와 커스텀 예외 사용 전략 질문
0
86
3
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
1
177
2
테스트를 위한 코드
1
105
2
프로젝트 실행 에러
0
151
2
PDF 문서에 오타가 있어서 알려드립니다.
1
102
1
enum질문
1
86
1
테스트 후 AfterEach 함수에서 나오는 쿼리
0
136
2
테스트 fixture
1
210
2
./gradlew test 실행시 인식할수 없다고 뜹니다.
0
140
1
test 코드 실행시 경고가 발생합니다.
0
140
1
13강 User Kotlin 변환중
2
169
3
'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문
2
174
1
-
0
141
2
4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?
0
312
3
junit import 불가
0
271
3
테스트 코드와 관련하여 질문이 있습니다.
1
218
1
hibernate가 select를 두번 하는 이유
0
240
1

