-
[Junit] doReturn과 thenReturn프로그래밍/Junit 2022. 2. 21. 18:13반응형
이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.
틀리거나 잘못된 정보가 있을 수 있습니다.
댓글로 알려주시면 수정하도록 하겠습니다.
1. doReturn과 thenReturn
두 메소드는 Mockito 프레임워크의 메소드로 단위 테스트 중 발생할 수 있는 어려움을 Stub을 이용하여 극복할 수 있도록 해주는 메소드입니다.
doReturn과 thenReturn은 모두 Stub을 만들어 Mock과 Spy의 특정 메소드 호출 시 반환 값을 Test에 코딩된 값으로 반환되도록 해주는 메소드입니다.
비슷한 기능을 하지만 2개의 메소드의 차이에 대하여 알아보도록 하겠습니다.
2. doReturn
doReturn 메소드는 when의 Spy객체 또는 Mock객체의 실제 메소드를 호출하여 Stubbing을 하지 않습니다. 즉 실제 메소드를 실행하지 않고 결과만 코딩된 결과를 반환하는 것입니다.
이번 포스팅에서 사용할 Class들을 먼저 살펴보겠습니다.
Service는 requestHttp메소드가 호출되면 httpRequestUtil의 연결 메소드인 connection을 호출하여 connection을 생성
이후 요청하고자 하는 요청을 parameter와 함께 getRequest를 통해 요청하는 구조입니다.
Mock객체를 이용한 doReturn 테스트
Mock으로 생성된 HttpRequestUtil Class를 Service에 주입한 뒤 reqeustHttp를 호출하는 Test입니다.
Mock의 경우 HttpRequestUtil의 껍데기만 가지고 있는 객체이므로 connect메소드나 getRequest메소드가 정의되어 있지 않습니다.
getRequest의 경우는 doReturn을 통해 Stubbing을 작성하여 "doReturn result" 문자열이 반환되는 것처럼 작성하였습니다.
또한 Mock객체의 경우 Subbing이 지정되지 않은 경우 반환 값에 대한 Default값을 반환하도록 되어 있으므로 connect메소드에 대하여 Subbing을 정의하지 않아도 Default값을 이용하여 Subbing 됩니다.
그렇게 때문에 Service의 requestHttp메소드 호출 시 위 그림처럼 doReturn result에 대한 assertThat이 통과되는 것을 확인할 수 있습니다.
Spy객체를 이용한 doReturn 테스트
Spy객체의 경우는 실제 메소드를 실행하여 테스트를 진행하므로 connect메소드에 대한 Stubbing을 정의하여야 합니다.
Mock과 같이 Default값이 없으므로 실제 메소드가 실행되기 때문입니다.
위에서 설명한 것처럼 doReturn의 경우 실제 메소드를 실행하지 않고 코딩된 결과 값만을 반환하는 메소드 이므로 Spy객체의 getRequest메소드를 실행하지 않고 해당 값만 반환하여 테스트를 진행합니다.
그 결과 Service의 requestHttp메소드는 정상적으로 "doReturn result"값을 반환하는 것을 확인할 수 있습니다.
doReturn 단점
doReturn의 메소드는 코딩된 반환 값을 Object로 전달받기 때문에 Spy로 만들어진 객체의 특정 메소드의 반환 값과 일지 하는지 검증이 되지 않습니다.
만약 실제 메소드의 반환 값과 doReturn메소드의 Parameter 값이 다른 경우 WrongTypeOfReturnValue오류가 발생합니다.
또한 실제 메소드를 실행하는 것이 아니므로 해당 실제 메소드의 문제를 알 수 없습니다.
3. thenReturn
thenReturn 메소드는 when의 Spy객체 또는 Mock객체의 실제 메소드를 호출하여 Stubbing을 합니다. 즉 실제 메소드를 실행하고 코딩된 결과를 반환하도록 하는 것입니다.
Mock객체를 이용한 thenReturn 테스트
Mock객체의 경우 실제 실행될 메소드가 없는 객체이므로 getRequest메소드 또한 실행될 내용이 없습니다. 그러므로 위에서 살펴본 doReturn처럼 메소드를 실행하지 않고 값만을 반환하는 것과 동일한 결과를 예상할 수 있습니다.
Spy객체를 이용한 thenReturn 테스트
Spy객체의 경우는 doReturn과 다른 결과가 나타납니다. 이유는 Spy객체의 경우는 실제 구현된 메소드를 실행하여 테스트하기 때문입니다.
위 테스트의 경우 Service의 requestHttp 메소드 호출 시 Util의 connect메소드를 호출합니다.
connect는 지정한 Stubbing인 doNothing을 통해 Stubbing 됩니다. 그 후 getRequest메소드를 호출하면 Util객체의 httpURLConnection이 Null인 상태로 메소드를 수행하게 됩니다.
그러므로 NullPointException이 발생하게 됩니다.
thenReturn 단점
실제 메소드를 호출하므로 메소드의 작업 시간이 오래 걸리는 경우 테스트 시간이 늘어날 수 도 있습니다.
사용된 예제 코드는 Git에 있습니다.
반응형'프로그래밍 > Junit' 카테고리의 다른 글
[Junit] Test Double Spy 상세 (1) 2022.02.14 [Junit] Mock과 MockBean (0) 2022.02.12 [Junit] Test Double (0) 2022.02.08 [Junit] Junit5 Exception Throw 테스트 (0) 2021.12.28