Mock 객체 Stubbing

Mock 객체 Stubbing

이 글은 백기선님의 '더 자바, 애플리케이션을 테스트하는 다양한 방법' 강의를 참고하였습니다.

https://www.inflearn.com/course/the-java-application-test

Stubbing

프로그래밍 특히 테스트에서 Stub이란 비슷한 일련의 구조를 만들어 테스트함을 말한다. wiki (https://en.wikipedia.org/wiki/Test_stub)를 찾아보면 더 자세히 알아볼 수 있는데, 코드를 미리 정해진 답변 (canned answer)를 제공하여 모의 실험 (simulate) 해보는 행동으로 볼 수 있다.

wikipedia 중

이번 글에서는 이러한 Mock객체를 Stubbing 하는 것을 정리해보려한다. Mock 객체를 어떻게 생성하는지는 저번에 정리한 글을 참고하기 바란다.

https://zepettoworld.tistory.com/65

Mock 객체는 기본적으로 Null을 리턴하고 ( Optional type은 Optional.empty 로 리턴 ) , Primitve의 기본값을 따르고 (ex. false) , 컬렉션은 비어있으며 , void 리턴시 예외가 발생하지않고 아무 일도 일어나지 않는다.

우선 상황을 만들어보면 memberId를 파라미터로 하여 해당 Member의 정보를 가져와서 , 가져온 정보가 옳바르게 가져왔는지 판단하고 싶다.

StudyService stubbing의 예시

member 객체에 예상하는 결과 (canned answer)을 제공(given)하고, 해당하는 상황(when)이 주어졌을 때 결과 (then)이 나오도록 조작해보자. 이렇게 선언하는 순간 memberService.findById(1L)의 return 값은 member라고 선언한 것.

memberService.findById() 에 memberId = 1L을 제공하고 그 결과로 member 를 얻거나 혹은 argument matcher를 이용해서 어떠한 파라미터도 가능하도록 설정이 가능하다. (Argument matchers - https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#3 )

또한 studyService 내부에서 작동하는 memberService는 호출되면서 mock 객체가 전달되어 해당 테스트 코드에서 생성한 memberService가 전달이 된다.

createNewStudy 내부에서 사용하는 memberService는 Mock 객체이다.

memberService.findById(1L)로 호출이 되면 member를 리턴하기로 되어있기 때문에 해당 테스트 코드는 성공하게 된다.

studyService를 통해 가져온 return 값(실제값) 과 "[email protected]"(기대값)이 같다

정리하면 memberService.findById()를 when과 then을 통해 설정을 해놓았고 , createNewStudy를 호출함과 동시에 내가 설정한 객체가 똑같이 리턴이 되는 것이다. -> Stubbing

return이 아니더라도 예외를 던질 수 있다.

1L이 들어오면 예외를 던질 수도 있다. memberService.validate(1L)이 호출될때 해당 예외를 던진다.

또한 호출되는 순서에 따라서 다르게 stubbing할 수 있는데, 첫번째는 return , 두번째는 throw, 세번째는 빈객체 return을 해보도록하자.

from http://zepettoworld.tistory.com/66 by ccl(A) rewrite - 2021-10-25 20:27:34