끄적끄적

[SPOCK] Spock의 Mock, Stub, Spy에 대해서 알아보자 본문

Back-end/Java

[SPOCK] Spock의 Mock, Stub, Spy에 대해서 알아보자

mashko 2022. 9. 13. 19:11
반응형

Spock의 Mock, Stub, Spy에 대해서 정리해두려고 한다.
Spock으로 테스트코드를 작성하며 mocking을 위해 Stub이나 Mock, Spy를 자주 사용하게 된다.
jUnit을 위주로 짜던 사람을 Stub이 약간 생소할 수도 있다.

Mock - 기대한 값을 받을 것으로 예상되는 객체를 의미하고(Stub과 유사), 테스트를 하는 함수가 잘 동작되는지 행위검증을 위해 사용된다.
Stub - 테스트 중에 만들어지며 정의된 응답을 리턴한다.(정의되지 않으면 응답값은 없다.)
Spy - 일부분만을 정의하여 사용한다. 나머지는 그대로 동작한다.

이렇게 알고 코드를 작성하다보면 Mock과 Stub이 제일 많이 헷갈리게 된다. 
간단하게 차이라고 말하면
Mock은 Stub과 유사하지만 Mock으로 지정된 클래스는 메서드가 지정된 Argument와 함께 몇 번 호출되었는지 확인할 수 있다.
그리고 Mock은 null,0을 보내고 Stub은 빈값("",{},[])을 리턴한다.
그래서 가끔 Stub을 쓰던 곳에 호출횟수나 null포인트에 대한 테스트를 하기위해 Mock으로 변경하면
내가 짠 테스트케이스들이 아닌데 다른 케이스들이 실패하는 지옥을 맛 볼 수 있게 된다.
반대로도 마찬가지다 Mock을 쓰는곳에 Stub으로 변경하게 되었을땐 그 반대의 이유로 실패케이스를 볼 수 있게 된다.
이러한 사이드 이펙트를 겪지 않으려면 Mock, Stub, Spy에 대해 용도별로 이해를 하고 선언해주는 것이 바람직하다.

이해를 돕기위해 Mock으로 된 부분을 Stub으로 변경하면 나오는 실패 문구 샘플 스크린샷을 첨부

호출 테스트부분을 제거하거나 Mock으로 선언하라고 친절하게 설명해준다.

반응형
Comments