Mocking은 테스트 시, 외부 의존성이나 실제 객체를 가짜 객체(mock)로 대체하여 코드의 특정 부분만을 검증하는 방법이다.
Mockito 같은 라이브러리는 이를 쉽게 구현할 수 있게 도와준다.
실제 동작 미검증
실제 환경에서의 이슈 탐지 어려움
유지보수 어려움
로직 변경시 mock 동작도 수정 필요
테스트 코드의 복잡성 증가
테스트는 주로 시스템이나 코드의 정확성과 안정성을 검증하기 위해 사용된다.
그 과정에서 "시스템이 어떻게 동작하는지"를 검증하는 행위 테스트와 "시스템이 무슨 결과를 내놓는지"를 검증하는 상태 테스트로 구분될 수 있다.
의존성
행위 테스트는 모킹 도구를 활용하여 의존성을 제거하거나 대체하면서 코드의 동작을 검증하게 된다.
상태 테스트는 그러한 의존성 제거에 덜 집중하며 결과값에 초점을 맞춘다.
결합도
행위 테스트는 때때로 내부 구현에 강하게 결합될 수 있다.
이는 리팩토링 시 테스트가 깨질 위험을 높이게 된다.
상태 테스트는 내부 로직보다는 외부 결과에 집중하기 때문에 이러한 문제가 상대적으로 적다.
테스트의 목적
코드의 핵심 로직이나 알고리즘이 올바르게 동작하는지 확인하기 위해서는 상태 테스트가 더 적합할 수 있다.
반면 시스템 간의 상호작용이나 사이드 이펙트를 검증하려면 행위 테스트가 필요하다.
테스트의 복잡성
행위 테스트는 복잡한 시나리오나 다양한 사이드 이펙트를 갖는 코드에서 특히 유용하다.
상태 테스트는 간단하고 명확한 결과 검증에 더 초점을 맞추게 된다.