공부하는 블로그

Spring | BDD - Given / When / Then 본문

Spring

Spring | BDD - Given / When / Then

치킨닮은닭 2023. 9. 3. 22:23

BDD?

 Behavior Driven Development. 행위 주도 개발의 줄임말로, 사용자의 행위에 중심을 두고 짜여진 시나리오를 기반으로 테스트 코드를 작성한다. 즉, 주어진 환경에서 유저의 행위에 대한 결과 검증을 진행한다.

 

Given, When, Then

 BDD의 정형화된 테스트 형식이다.

 

- Given : 시나리오에서 유저에게 주어진 환경

- When : 유저의 행위

- Then : 행위의 예상되는 결과

 

 예를 들어, 나는 빵집 리뷰 플랫폼을 만드는 개발자인데 "서울지역 이외의 빵집을 사용자가 리뷰로 등록할 때, 리뷰 등록이 불가능하다." 라는 유저 시나리오가 있다고 가정하면,

 

- Given : 서울 이외의 지역 입력

- When : 사용자가 리뷰 등록

- Then : 예외 발생

 

로 나누어 테스트 코드를 작성할 수 있다.

 

Java Code Example

 BDDMockito를 이용하여 given, when, then 형식의 단위 테스트를 작성해보도록 하자.


Mockito vs BDDMockito?

 기존에 사용되던 Mockito의 mocking 코드를 BDD 형식으로 바꾼 것이 BDDMockito 이다. 

// Mockito
when(userService.findById(any())).thenReturn(user)

// BDDMockito
given(userService.findById(any())).willReturn(user)

- when().thenRerturn() 을 BDD 형식에 맞게 given().willReturn()으로 변경

 


 

 위의 예시 시나리오 "서울지역 이외의 빵집을 사용자가 리뷰로 등록할 때, 리뷰 등록이 불가능하다." 를 테스트코드로 작성해보자.

@Test
@DisplayName("서울 지역 이외의 빵집은 리뷰 등록이 불가능하다.")
void givenNotSeoulWhenSaveBakeryThenThrowException() {
    // given
    BakerySaveRequestDto request = mock(BakerySaveRequestDto.class);
    given(request.getCity()).willReturn("경기");

    // then
    assertThrows(IllegalCityException.class, () -> {
        // when
        bakeryService.save(request);
    });
}

@Test
@DisplayName("서울 지역 빵집은 리뷰 등록이 가능하다.")
void givenSeoulWhenSaveBakeryThenSuccess() {
    // given
    BakerySaveRequestDto request = mock(BakerySaveRequestDto.class);
    given(request.getCity()).willReturn("서울");

    // when
    bakeryService.save(request);

    // then
    then(bakeryRepository)
        .should()
        .save(any());
}

- given절에서는 given() 을 이용하여 Mock 객체의 리턴 값을 지정한다. (시나리오 환경 세팅)

- when절에서는 테스트할 행위 메서드를 수행한다.

- then절에서는 예상 결과를 검증한다.

 

 

Reference

- Baeldung Blog : Quick Guide to BDDMockito

- if(kakao) 2020 : kotest가 있다면 TDD 묻고 BDD로 가!

'Spring' 카테고리의 다른 글

Spring | MockServer  (0) 2023.09.24
Spring | @TransactionalEventListener  (0) 2023.09.17
Spring | Application Event  (0) 2023.09.10
Spring | Mockito Unit Test  (0) 2023.08.27
Spring | Annotations  (0) 2020.09.29
Comments