1) Mockito란?
- Mockito는 Mock을 지원하는 프레임워크입니다.
여기서 말하는 Mock은 진짜 객체와 비슷하게 동작하지만,
프로그래머가 직접 컨트롤할 수 있는 객체를 의미합니다.
- 다시 말해, Mockito는 Mock 객체를 쉽게 만들고 어떻게 동작해야하는지 관리하고
실제로 어떻게 동작했는지 검증할 수 있는 방법을 제공합니다.
- Mockito는 가장 많이 사용되는 Mock 프레임워크 중 하나입니다.
- 애플리케이션이 간단한 상황에서는 Mock을 쓸 일이 잘 없지만,
애플리케이션이 DB를 사용한다던가, 외부 API를 호출한다면,
그 상황에서 항상 외부 API를 사용하면서 테스트할 수 없기 때문에,
외부 API를 어떻게 사용할지 예측을 해서 Mock으로 만듭니다.
- 마찬가지로 데이터베이스에 Operation하는 객체, 즉 DAO나 Repository 객체를
Mock으로 만들고, 그 객체가 어떻게 동작해야 하는지를 Mockito로 코딩하고,
그리고 우리 서비스가 그렇게 동작한다는 가정하에,
DAO 혹은 Repository를 사용했을 때 어떻게 동작할 것인가를 테스트합니다.
2) Unit 테스트에 대한 논의
- Mockito를 쓰게 되면 종종 Unit test에 대한 논의를 하게 됩니다.
마틴 파울러가 Mock을 사용하는 Unit test에 대해 언급을 합니다.
- 마틴 파울러에 따르면 어떤 개발자는 Mock을 사용하는 Unit test에 대해서 어떤 객체나 클래스 하나의 단위로,
굉장히 strict하게 정의를 합니다.
그런 개발자들에게는 모든 의존성을 Mocking을 해야지만, 단위 테스트라고 생각을 하는데,
그래서 Mocking 프레임웍이 유명해졌습니다.
- 모든 의존성을 끊고 단위 테스트를 해야 한다고 강하게 주장을 하는 분들도 있는데,
사실은 반드시 그래야만 Unit test라고 볼 수 있는 것은 아닙니다.
- Unit test는 어떤 행동의 단위로 생각할 수도 있습니다.
이는 프로젝트를 같이 하는 사람끼리 합의를 할 문제입니다.
단위 테스트의 단위는 어떻게 정의를 할 것인가,
Mock은 어느 범위에서 적용할 것인가에 대해서 고민해야 합니다.
- 구현이 되어 있는 클래스는 굳이 Mocking을 할 필요는 없지만,
직접 컨트롤 하기 힘든 외부 서비스는 Mocking을 하는게 좋다고 생각할 수 있습니다.
- 하지만 그 외부 서비스가 테스트 환경을 제공할 수도 있습니다.
가령 결제 서비스인데 Payment를 프록시처럼 제공해주는 여러가지 서비스들이 있습니다.
대표적인 것으로 Bango가 있습니다.
단, 테스트 환경이 없다면 Mocking을 하는 수 밖에 없습니다.
참고
백기선 더 자바, 애플리케이션을 테스트하는 방법
'테스트' 카테고리의 다른 글
Assertions 클래스 assertThatThrownBy (0) | 2022.09.03 |
---|---|
JUnit 5 기초 (0) | 2022.08.20 |