개념 공부/Test Code

[ Test Code / Java ] Mockito와 BDDMockito

clean01 2025. 5. 3. 17:15

Mockito와 BDDMockito

테스트 코드에서 given() 메서드로 stubbing 하는 코드도 있고 when() 메서드로 stubbing 하는 코드도 있는 것을 보았다.
왜 저렇게 2가지 방법으로 stubbing이 가능한건지, 뭐가 다른건지 포스팅을 하며 알아보고자 한다.

 

우선 결론부터 말하자면, given으로 스터빙하는건 BDDMockito를 활용한 것이고, when으로 스터빙하는 코드는 Mockito를 활용한 테스트 코드이다.

 

 


BDDMockito

BDDMockito는 행동 주도 개발(Behavior Driven Development) 방식에 기반한 Mockito의 확장이다.

따라서 Mockito 라이브러리를 사용하면 BDDMockito를 사용할 수 있고, 내부코드를 확인해보면 Mockito를 상속받고 있다.

 

기능상 차이는 없지만 given(), when(), then() 메서드를 통해서 BDD 스타일의 문법을 제공하고 테스트 케이스를 더 이해하기 쉽게 만든다.

 

 

javadoc에는 BDDMockito 클래스가 도입된 이유에 대해 아래와 같이 설명하고 있다.

현재 스텁(API)은 when 키워드의 규범적 역할로 인해 given, when, then 주석과 자연스럽게 통합되지 않는 문제가 있다.

스텁이 테스트의 given 구성 요소에 속하고 when 구성 요소에 속하지 않기 때문이다.

그래서 BDDMockito 클래스에서는 given(Object) 메서드를 사용해서 메서드 호출에 스텁을 정의할 수 있는 별칭을 도입했다.

 

 

 

Mockito 기반의 테스트 코드

@Test
void mockito_test() {
    // given
    Long id = 1L;
    String name = "sejeong";

    when(studentRepository.findById(id)).thenReturn(new Student(id, name, 25)));

    // when
    studentService.getStudentInfo(id);

    // then: 정확히 한번 호출되었는지 검증
    verify(studentRepository, times(1)).findById(any());
}

Mockito 기반의 테스트 코드를 보면 // given 이라고 주석 표시 해둔 자리에 when() 메서드로 테스트 코드를 쓰고 있어 주석의 의미와 일치하지 않는다.

 

 

의미를 더 명확하게 하기 위해서 BDDMockito 클래스가 등장했다.

 

BDDMocito 기반의 테스트 코드

@Test
void BDDmockito_test() {
    // given
    Long id = 1L;
    String name = "sejeong";

    given(studentRepository.findById(id)).willReturn(new Student(id, name, 25)));

    // when
    Student student = studentService.getUserTerms(id);

    // then
    assertEquals(student.getName(), "sejeong");
    then(studentRepository).should().findById(id);
}

BDDMockito

  • given(): 테스트의 초기 상태를 설정하는 메서드. Mock 객체의 메서드 호출에 대한 반환값을 설정한다.
  • when(): 실제 동작이 수행되는 부분을 표현하는 메서드. Mock 객체의 실제 메서드를 호출
  • then(): 테스트의 예상 결과를 검증. then(userTermsAgreeRepository).should().findById(id); ⇒ 이런식으로 검증함

즉, 정리하면 Mockito를 활용한(즉, when으로 스터빙하고 있는) 테스트 코드가 비교적 예전 테스트 코드였던 듯하다.
BDDMockito를 쓰는 것이 의미를 명확하게 전달하는 데에 좋을 것 같다.


Reference

https://jaehoney.tistory.com/220#google_vignette

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