본문 바로가기
SpringBoot

Java Mockito when(), BDDMokito given()

by 오렌지마끼야또 2022. 8. 8.
728x90
반응형

 

 

 

 

개발을 하면서 Junit5 Unit Test Framework 를 이용한 테스트코드를 작성하는데 다른 개발자분들이 짜놓은 코드를 보니 첫번째, 두번째, 세번째 Layer 는 given() 함수로 써있는데 마지막 네번째 Layer 만 when() 함수로 작성되어있었다. 그래서 무슨 이유가 있나? 하고 두 함수에 대해 찾아보았다.

 

 

테스트를 위해 Mock 객체를 만들고 리턴값을 설정하기 위해 Mockito의 when()함수를 쓰거나 BDDMockito의 given() 함수를 사용한다. 이 둘의 차이점에 대해 간단히 알아보자.

 

 

 

BDD(Behavior-Driven Development) 란?

 - 행위 주도 개발

 - 테스트 대상의 상태의 변화를 테스트하는 것이고, 시나리오를 기반으로 테스트하는 패턴을 권장

 - 권장하는 기본 패턴은 Given, When, Then 구조

 - given : A라는 메소드에게 너가 호출되면 어떤 행동을 하라고 알려주고

 - when : A가 포함된 S 동작를 실행시켰을 때

 - then : 그러면 그 S 동작이 의도한대로 실행되었는지 확인

 

비유를 하자면 영화 감독이 각 배우들한테 어떻게 하라고 알려주고(given) 액션!(when), 컷! 모니터링(then) 하는 느낌이랄까?

 

given, when, then 개념으로 코드를 작성하면 given 위치에 Mokito의 when() 함수가 쓰이게 된다.

그래서 이를 더 보기좋게, 개념적으로 이해하기 쉽게, 가독성을 높이려고 만든(이름을 바꾼) 것이 DBBMokito 이다.

 

위의 코드를 DBBMokito 로 바꾸면 아래와 같다.

실제로 when() 과 given() 은 사용상의 차이점이 거의 없다고 한다.

Mockito에서 제공한 기능 그대로 사용할 수 있으면서 BDD가 추구하는 것처럼 "시나리오에 맞게 테스트 코드가 읽힐 수 있도록" 도와준다.

 

 

 

 

그럼 다시 원래 궁금증으로 돌아와서, 왜 네번째 Layer에만 when()이 쓰였는가? 너무 궁금해서 부장님들께 여쭤봤다.

한분은 모르겠다고 하셨고 한분은 아마 초반에 구조 만들때 그렇게 만들어져서 그냥 그대로 쓴 것 같다고 하셨다.

즉, 아무 이유 없음. 실망스러운 순간이었다. 지금까지 이것을 보고 아무도 의문을 품지 않았나? 그래서 내가 그럼 다 given() 으로 바꾸면 안되냐 했더니 그냥 두라고 하셨다. 어차피 똑같다고.

맞다 똑같다. 하지만 나는 규모있는 프로젝트를 진행하면서 작은 부분이라도 통일성을 맞추는게 중요하다고 생각한다. 지금 개발하는 우리야 그런가보다 하고 넘길지언정 나중에 들어온 개발자는 해당 코드를 보고 나와 똑같은 고민을 되풀이 할 수 있기 때문이다.

하지만 난 일개 사원이기에 힘이 없으니 그냥 따를 수 밖에.. 여러모로 아쉬운 순간이었다.

 

 

 

 

출처

 

https://velog.io/@lxxjn0/Mockito와-BDDMockito는-뭐가-다를까

 

 

 

 

 

 

728x90
반응형

댓글