Spring

BDDMock으로 서비스 테스트하기

우선 모키토란 유닛 테스트를 위한 프레임워크인데, 단위테스트를 하기 위해서 목을 만들어주는 프레임워크이다.

목 객체를 만들고, 목 객체동작을 지정하고, 테스트 대상 로직이 제대로 수행되었는지 확인하는 것.

우리는 mockito를 사용하여 테스트할 때 when()과 stub을 이용해 행위를 지정해주어야한다.

when 메소드를 통해 특정 메소드가 호출되었을 때 특정 값을 반환하라고 설정한다.


이때 설정한 반환값을 stub이라고 한다.

ex. when(Joanne.say()).thenReturn(new Say("안녕"));

-> new Say("안녕")이 Stub 역할을 한다.

 

또한 doThrow().when() 을 통해 특정 상황에서 예외를 던지도록 설정할 수 있다.


더불어 verify()를 이용해 검증도 할 수 있다.

verify(Joanne, times(n)).getName());
-> getName을 n번 호출했는지 검증한다.

 

이 외에도 더 많은 메서드가 존재하므로, 자세한 내용은 여기에서 확인할 수 있다.

그럼 여기서 BDD 모키토란 무엇인가?

그냥 모키토의 경우 when()으로 행위를 지정해준다.

하지만 우리는 given-when-then의 구조로 테스트를 하는 경우가 많은데, given에 해당하는 행위 지정이 when 을 통해 이루어지는 것이 테스트의 흐름을 읽어나가는 가독성에 좋지 않을 수 있다.

 

이때, BDD mockito는 given/when/then 구조를 권장한다.


즉, BDD 모키토는 BDD를 사용하여 테스트 코드를 작성할 때 시나리오에 맞게 테스트코드가 읽힐 수 있도록 도와주는 프레임워크! 이다.

 

간단한 예로, Mockito의 when -> given으로, verify()도 then().should()로 대체될 수 있다!

 

잠깐 테스트 코드를 통해 알아보자면, 다음과 같이 작성할 수 있다.

테스트하고 싶은 메서드가 다음과 같이 작성되어있을 때,

// LineService.java 
public LineResponse findLineResponseById(Long id) {
        Line persistLine = findLineById(id);
        return LineResponse.of(persistLine);
}

private Line findLineById(Long id) {
        if (lineDao.isNotExistById(id)) {
            throw new LineNotFoundException(String.valueOf(id));
        }
        return lineDao.findById(id);
}

 

우리는 LineServiceTest의 Mock으로 LineDao를 필요로한다.

그렇게 작성된 findLineResponseById의 테스트 메서드는 다음과 같다.

@Test
@DisplayName("존재하는 아이디의 노선을 가져올 수 있다.")
void findLineResponseById() {
        given(lineDao.isNotExistById(1L)).willReturn(false);
        given(lineDao.findById(1L)).willReturn(new Line(1L, NAME, COLOR, EXTRA_FARE));

        final LineResponse lineResponse = lineService.findLineResponseById(1L);
        assertThat(lineResponse.getId()).isEqualTo(1L);
        assertThat(lineResponse.getName()).isEqualTo(NAME);
        assertThat(lineResponse.getColor()).isEqualTo(COLOR);
}

 

요약하자면, findLineResponseById 내부에서 lineDao(Test에서의 Mock)를 이용하는 메서드는 모두 행위를 지정해주고,

우리는 그 흐름을 파악하고 제대로 된 결과값이 나오는지 확인하는 것!

 

이 또한 자세한 내용은 Mockito와 BDDMockito는 뭐가 다를까? 에서 확인할 수 있다.

 

끗!