728x90
반응형
Mock이란?
실제 객체를 만들어 사용하기에 시간, 비용 등의 Cost가 높거나 혹은 객체 서로간의 의존성이 강해 구현하기 힘들 경우 가짜 객체를 만들어 사용하는 방법이다.
Mock 객체는 언제 필요한가?
- 테스트 작성을 위한 환경 구축이 어려운 경우
- 테스트가 특정 경우나 순간에 의존적인 경우
- 테스트 시간이 오래 걸리는 경우
- 개인 PC의 성능이나 서버의 성능문제로 오래 걸릴수 있는 경우 시간을 단축하기 위해 사용한다.
Mock에 대한 기본적인 분류 개념, 테스트 더블
1. 테스트 더블
- 테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행 할 수 있도록 만들어주는 객체를 말한다.
- Mock 객체와 유사한 의미를 가지며 테스트 더블이 좀더 상위 의미로 사용된다.
2. 더미객체(Dummy Object)
- 단순히 인스턴스화될 수 있는 수준으로만 객체를 구현한다.
- 인스턴스화된 객체가 필요할 뿐 해당 객체의 기능까지는 필요하지 않은 경우에 사용한다.
3. 테스트 스텁(Test Stub)
- 더미 객체 보다 좀더 구현된 객체로 더미 객체가 마치 실제로 동작하는 것처럼 보이게 만들어 놓은 객체이다.
- 객체의 특정 상태를 가정해서 만들어 특정 값을 리턴해 주거나 특정 메시지를 출력해 주는 작업을 한다.
- 특정 상태를 가정해서 하드코딩된 형태이기 때문에 로직에 따른 값의 변경은 테스트 할 수 없다.
- 즉, 어떤 행위가 호출됐을 때 특정 값으로 리턴시켜주는 형태가 Stub이다.
4. 페이크 객체(Fake Object)
- 여러 상태를 대표할 수 있도록 구현된 객체로 실제 로직이 구현된 것처럼 보이게 한다.
- 실제로 DB에 접속해서 비교할 때와 동일한 모양이 보이도록 객체 내부에 구현 할 수 있다.
- 테스트케이스 작성을 위해서 다른 객체들과의 의존성을 제거하기 위해 사용한다.
- 페이크 객체를 만들 때 복잡도로 인해서 노력이 많이 들어 갈 경우 적절한 수준에서 구현하거나, Mock 프레임 워크를 사용한다.
- 페이크 객체를 생성하기 위한 노력이 많이 필요한 경우 실제 객체를 가져와 테스트 한다.
5. 테스트 스파이(Test Spy)
- 테스트에 사용되는 객체, 메소드의 사용 여부 및 정상 호출 여부를 기록하고 요청시 알려준다.
- 테스트 더블로 구현된 객체에 자기 자신이 호출 되었을 때 확인이 필요한 부분을 기록하도록 구현한다.
- 특정 테스트 메서드가 몇번 호출 되었는지 필요한 경우 전역 변수로 카운트를 설정하고 특정 테스트 메서드에 카운트를 올리는 부분을 추가한 후 이 카운트를 가져오는 메서드를 추가한다.
- 특정 메소드가 호출 되었을 때 또 다른 메서드가 실행이 되어야 한다와 같은 행위 기반 테스트가 필요한 경우 사용한다.
6. Mock 객체(Mock Object)
- 행위를 검증하기 위해 사용되는 객체를 지칭하며 수동으로 만들 수도 있고 프레임워크를 통해 만들 수 있다.
- 행위 기반 테스트는 복잡도나 정확성등 작성하기 어려운 부분이 많기 때문에 상태 기반 테스트가 가능하다면 만들지 않는다.
- Mock 객체는 테스트 더블 하위객체로 써의 좁은 의미와 테스트 더블을 포함한 넓은 의미 2가지로 사용 될 수 있다.
이때 Mock Object는 행위 검증(behavior verification)에 사용하고, Stub은 상태 검증(state verification)에 사용하는 것이다.
Mock 사용시 유의사항
- Mock 프레임워크가 정말 필요한지 확인한다.
- Mock을 사용하는 경우 테스트 케이스 유지에 복잡성이 더해지기 때문에 Mock이 없는 의존성 적은 구조로 프로그래밍 한다.
- 어떤 Mock 프레임워크를 사용하느냐는 핵심 문제가 아니다.
- 어떤 프레임워크를 사용하느냐에 따라 테스트 케이스 작성에 커다란 영향이 미치지 않는다. 단지 익숙해지기 까지 시간이 필요할 뿐이다.
- Mock 객체는 Mock 일 뿐이다.
- 실제 객체로 작동을 해보았을 때 잘 작동하지 않을 수도 있다. Mock 객체는 흉내를 내는 객체이기 때문이다.
728x90
반응형
'Study > Java' 카테고리의 다른 글
[JAVA] Try-Catch문이란? 예외처리하기/예외던지기 (0) | 2023.02.07 |
---|---|
[JAVA] 숫자형식 포멧 방법 (0) | 2023.01.05 |
[JAVA] equalsIgnoreCase 문자열 비교 방법 (0) | 2022.11.24 |
[JAVA] 람다를 사용하는 이유 (0) | 2022.11.24 |
[Java] Invalid character found in method name. HTTP method names must be tokens 에러 (0) | 2022.11.09 |
댓글