반응형
  • BDD(Behavior-driven development)
    • 애플리케이션이 어떻게 “행동”해야 하는지에 대한 공통된 이해를 구성하는 방법으로, TDD에서 창안했다.
    • 행동에 대한 스팩
      • Title
        • 제목(이야기를 설명하는 한 줄)
      • Narrative(이야기)
        • As a
          • 역할
        • I want
          • 기능
        • so that
          • 이점(기능을 원하는 이유)
          • 기능이 실제로 이점을 제공하지 못한다면 일반적으로 누락된 이야기가 있음을 의미한다.
      • Acceptance Criteria
        • Given
          • 어떠한 상황이 주어졌을 때
        • When
          • 어떤 행위를 하면
        • Then
          • 결과는 이렇게 될 것이다.

 

  • 예) BDD 이야기 작성
(Title)스토리: 계좌 소유자가 현금을 인출하다.

Narrative:
(As an)계좌 소유자로서
(I want)ATM에서 현금을 인출하고 싶어요
(So that)은행이 문을 닫았을 때 돈을 받을 수 있도록

Scenario 1: 계좌에 충분한 자금이 있습니다.
(Given)계좌 잔액이 $100입니다.
       그리고 카드는 유효합니다.
       또한 기계에 충분한 돈이 들어 있습니다.
(When) 계좌 소유자가 $20를 요청합니다.
(Then) ATM은 $20를 지급해야 합니다.
       계좌 잔액은 $80이어야 합니다.
       카드를 반환해야합니다.

Scenario 2: 계좌에 자금이 부족합니다.
(Given) 계좌 잔액은 $10입니다.
       그리고 카드는 유효합니다.
       또한 기계에 충분한 돈이 들어 있습니다.
(When) 계좌 소유자가 $20를 요청합니다.
(Then) ATM은 돈을 분배해서는 안 됩니다.
       ATM은 자금이 부족하다고 말해야 합니다.
       계좌 잔액은 $20이어야 합니다.
       카드를 반환해야합니다.

Scenario 3: 카드가 비활성화되어있다.
(Given) 카드가 비활성화되었습니다.
(When) 계좌 소유자가 $20를 요청합니다.
(Then) ATM은 카드를 보관해야 합니다.
       ATM은 카드가 보관되었다고 표시해야 합니다.

Scenario 4: ATM에 자금이 부족합니다
...

 

  • Mockito는 BddMockito라는 클래스를 통해 BDD 스타일의 API를 제공한다.
    • When -> Given
    given(memberService.findById(1L)).willReturn(Optional.of(member));
    given(studyRepository.save(study)).willReturn(study);

    • Verify -> Then
    then(memberService).should(times(1)).notify(study);
    then(memberService).shouldHaveNoMoreInteractions();

 

Mockito - BDD API 사용예제

    @DisplayName("다른 사용자가 볼 수 있도록 스터디를 공개한다.")
    @Test
    void openStudy() {
        // Given
        StudyService studyService = new StudyService(memberServiceMock, studyRepositoryMock);
        Study study = new Study(10, "더 자바, 테스트");
        assertNull(study.getOpenedDateTime());
        given(studyRepositoryMock.save(any())).willReturn(study);

        // When
        studyService.openStudy(study);

        // Then
        assertEquals(StudyStatus.OPENED, study.getStatus());
        assertNotNull(study.getOpenedDateTime());
        then(memberServiceMock).should().notify(study);
    }

[참고자료]

더 자바, 애플리케이션을 테스트하는 다양한 방법, 백기선

https://javadoc.io/static/org.mockito/mockito-core/3.2.0/org/mockito/BDDMockito.html

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#BDD_behavior_verification

http://dannorth.net/whats-in-a-story/

반응형

+ Recent posts