원인, 문제
테스트 코드에 대한 공부를 하면서 여러 영상들을 서칭하여 시청했다.
그런데 어떤 영상에서는 Mock 객체에 대한 행위를 정의할 때 when()
메소드를 사용하고 다른 영상에서는 given()
를 사용했다.
그래서 둘의 차이점이 무엇인지 찾아보았다.
Mockito
Mockito 프레임워크는 개발자가 테스트를 진행할 때 Controller가 의존하는 Service 객체를 실제 Service객체를 대신할 Mock객체로 대체하기 쉽게 해준다.
쉽게 말해서 Controller가 의존하는 Service 때문에 Controller Test에 영향을 주지 않도록 Service 객체의 역할을 수행하는 척 하는 클래스를 대체해줘야한다.
이는 Mockito를 사용하지 않으면 개발자가 직접 Service 클래스와 동일한 인터페이스를 구현하는 MockService를 구현하여 직접 DI를 해주어야 하지만 Mockito 프레임워크는 해당 작업을 간단하게 사용할 수 있게 해준다.
when(), given()
when()과 given()은 Mock 객체가 수행할 작업을 정의해주는 것이다.
@Test
public void test1(){
// given(service.signUp(B)).willReturn(true);
when(service.signUp(B)).willReturn(true);
}
service의 signUp 메소드에 B라는 매개변수가 들어온 경우, true를 리턴하도록 Mock 객체의 행위를 정의해줄 때 사용한다.
사실 둘의 차이점은 없다.
BDD (Behavior Driven Development)
행위 주도 개발은 TDD에서 파생된 개발 방법론으로써 코드를 작성하기 이전에 코드가 수행할 행위를 미리 정의를 하는 방식입니다.
Given-When-Then 패턴
행위 주도 개발의 테스트에서는 Given-When-Then 패턴을 사용하여 코드를 작성합니다.
import static org.mockito.BDDMockito.*;
Seller seller = mock(Seller.class);
Shop shop = new Shop(seller);
public void shouldBuyBread() throws Exception {
//given
given(seller.askForBread()).willReturn(new Bread());
//when
Goods goods = shop.buyBread();
//then
assertThat(goods, containBread());
}
위와 같이 테스트 코드를 작성합니다.
여기서 중요한 점은 when() 메소드가 Given-When-Then 패턴의 when과 겹침과 동시에 given에서 작성해주는 작업을 해주고 있습니다.
그래서 이러한 이해하기 힘든 점을 개선하기 위해서 when()과 동일한 given() 메소드가 등장했습니다.
given() 메소드는 org.mockito.BDDMockito
에 정의되어 가독성을 높이기 위해 등장하였으며 Mockito 클래스를 상속하고 있습니다.
결론
given()과 when() 메소드는 동일하게 Mock 객체의 행위를 정의하지만 BDD에서 사용하는 Given-When-Then 패턴과 같이 사용할 때 가독성을 위해서 메소드 이름을 바꾼 메소드라고 볼 수 있습니다.
참고
'Spring' 카테고리의 다른 글
[Spring] ControllerAdvice, RestControllerAdvice를 통한 예외 처리 (0) | 2024.02.02 |
---|---|
[Spring Test] Spring Boot Controller 단위 테스트 (1) | 2024.01.31 |
[Spring Boot] 스프링 부트 HTTPS 적용 방법 (1) | 2024.01.26 |
[Spring Boot] Interceptor 활용 (1) | 2024.01.25 |
[Spring Boot] application.yml profile 기능 (1) | 2024.01.25 |