Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Junit 5
- ObjectMapper
- 인프콘2023
- Test code
- FCM
- Coputer Science
- enumSet
- backend
- Java
- Server
- RequestBody
- softeer
- ExceptionResolver
- 공룡책
- Service 계층 테스트
- 소프티어
- Spring
- MySQL
- Test Doulbe
- 테크쇼
- JPA
- Test
- modelmapper
- 일상
- mapstruct
- 자바
- db
- JPQL
- proxyFactory
- OS
Archives
- Today
- Total
공부내용공유
Test Double이란? 본문
서론
현재 프로젝트에서 Service 계층 테스트를 service 계층은 2개의 계층과 연결되어 있는만큼 굉장히 다양한 기능들에 의존을한다.
RDB connection, 데이터 세팅, Mapper, Spring context 등등
구글링을 했을때 spy, mock 등등 다양한 어노테이션을 사용하는것을 보았는데 정확히 어떤 역할을 해주고 어떤때 사용해야하는지 몰라서 이를 정리하기 위해 이 글을 작성하였다.
Test Double
- test double이란 테스트 하려는 코드 부분을 제외한 나머지 코드로부터 영향을 받지 않고 테스트를 진행하기 위해 가상의 객체를 생성하여 주입하는것을 말한다.
- Test Double을 통해 테스트에 의존적인 객체, DB, 여러 설정 정보들로부터 격리시켜 테스트 속도를 높일 수 있다.
- 영화배우 대신 위험한 역할을 하는 stunt double이라는 용어에서 유래된 단어이다. ㅋㅅㅋ
Test Double 의 종류
- Dummy
- 필요한 메서드 인터페이스도 존재하지 않고 단순히 객체 자체로 넣어놓기 위해 만드는 객체이다.
- Fake
- 실제 동작하는 구현을 가지고 있지만, 프로덕션의 동작과는 다른 객체이다.
- DB Repository를 임시적으로 Collection Repository로 구현하는 경우
- 로직은 다 있겠지만 프로덕션에서는 사용하기 적합하지 않다.
- Stub
- 메서드의 입력값에 출력값을 미리 정의해놓은 객체이다.
- Fake와 다르게 로직은 존재하지 않는다.
- Mockito 에서 @Mock ,@MockBean 을 활용하여 만든 객체가 이에 해당한다.
- Spy
- 실제 객체를 부분적으로 stubbing 하고 메소드 호출 여부, 호출 횟수 같은 정보를 기록하는 객체이다.
- 프록시 객체를 생성하고, 이 객체의 메서드가 프로덕션 객체를 대리 호출하는 방식으로 구현한다.
- 동작 방식을 정한 spy 객체의 메서드는 정해진 방식으로 동작하고, 그렇지 않은 경우는 원본 객체의 행위를 수행한다.
- Mock
- 호출에 대한 기대를 명세할 수 있고, 그 내용에 따라 동작하는 객체이다.
- 설정에 따라 Mock은 spy, dummy, stub처럼 동작할 수 있다.
테스트 더블의 경계는 명확한 것이 아니고 스펙트럼으로 보는것이 바람직하다.
Test Double의 장점
- 컨트롤 할 수 없는 영역을 Test Double을 통해 테스트 할 수 있다.
- 외부 의존성에 의해 같은 결과가 보장되지 않는것을 막을 수 있다.
- 테스트 속도를 증가시키도록 context를 구성할 수 있기 때문에 빠른 피드백을 받을 수 있다.
Test Double의 단점(조심해야 할 점)
- 테스트 하는 내용이 구체적인 구현에 의존하게 만든다.
- 테스트 코드보다 Mocking을 작성하는데 더 걸리는 주객전도가 일어날 수 있다.
- Mocking이 정의된 코드는 그렇지 않은 코드에 비해 가독성이 떨어진다.
Test Double은 언제 사용해야 할까?
사실 아직 잘 모르겠다. 컨트롤이 힘든 외부 API나 결과값이 달라지는 경우는 Test Double을 사용하는게 맞는거 같은데 그 외에서는 어디까지 Test Double을 적용하는게 맞을까? 이건 계속 경험을 쌓고 공부하면서 나만의 기준을 만들어 가야될거 같다.
'Spring > Spring' 카테고리의 다른 글
FCM 기능 구현 및 리팩토링을 하면서의 고민들 (0) | 2023.09.08 |
---|---|
Spring Proxy Factory 뜯어보기 (0) | 2023.09.05 |
Test Code H2 DB 사용시 주의사항 (0) | 2023.07.28 |
Junit 5 Service,Mapstruct, ModelMapper Unit Test (단위 테스트) (0) | 2023.07.07 |
Spring ModelMapper, MapStruct 적용에 관하여 (2) | 2023.06.01 |