카테고리 없음

JUnit5 - Java에서의 단위테스트6 - BDD

ysk(0soo) 2022. 8. 21. 21:56

BDD 스타일 Mockito API

BDD:애플리케이션이 어떻게 “행동”해야하는지에 대한 공통된 이해를 구성하는 방법으로, TDD에서 창안했다.

  • BDD : Behaviour-Driven Development의 약자
  • TDD : Test-Driven Development의 약자

BDD는 시나리오를 기반으로 테스트 케이스를 작성하며 함수 단위 테스트를 권장하지 않는다. 이 시나리오는 개발자가 아닌 사람이 봐도 이해할 수 있을 정도의 레벨을 권장한다. 하나의 시나리오는 Given, When, Then 구조를 가지는 것을 기본 패턴으로 권장하며 각 절의 의미는 다음과 같다.

Feature : 테스트에 대상의 기능/책임을 명시한다. Scenario : 테스트 목적에 대한 상황을 설명한다. Given : 시나리오 진행에 필요한 값을 설정한다. When : 시나리오를 진행하는데 필요한 조건을 명시한다. Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시한다.

테스트 대상은 A 상태에서 출발하며(Given) 어떤 상태 변화를 가했을 때(When) 기대하는 상태로 완료되어야 한다. (Then) 또는 Side Effect가 전혀 없는 테스트 대상이라면 테스트 대상의 환경을 A 상태에 두고(Given) 어떤 행동을 요구했을 때(When) 기대하는 결과를 돌려받아야 한다. (Then)

행동에대한스팩

  • Title
  • Narrative
    • As a / I want / so that
  • Acceptance criteria
    • Given / When / Then

Mockito는 BddMockito라는 클래스를 통해 BDD스타일의 API를제공한다.

Given

  • org.mockito.BDDMockito.given() 메서드
    • 위에서 사용했던 when을 다음과 같이 바꿀 수 있다. when -> given
    • when(memberService.findById(1L))
              .thenReturn(Optional.of(member));
      when(studyRepository.save(study))
              .thenReturn(study)
      //
      given(memberService.findById(1L))
              .willReturn(Optional.of(member));
      given((studyRepository.save(study)))
              .willReturn(study);

Then

  • org.mockito.BDDMockito.then() 메서드
    • 위에서 사용했던 verify를 다음과 같이 바꿀 수 있따. verify -> then
    • verify(memberService, times(1)).notify(study);
      verifyNoMoreInteractions()
      
      then(memberService).should(times(1)).notify(study);
      then(memberService).shouldHaveNoMoreInteractions();

참고