Jeomxon's Tech Note

Mockito를 써보면서... 본문

Spring/Test

Mockito를 써보면서...

저문(jeomxon) 2023. 4. 24. 17:53

서비스는 어떻게 테스트할 수 있을까?

레벨2 첫 미션인 자동차 경주 미션은 요구사항이 많지 않았다.

그에 비해 공부해야할 양은 방대했다.

그 중 가장 시간을 많이 썼던 부분은 테스트였다.

특히나 서비스 계층에 대한 테스트를 작성할 때, 어디서부터 어떻게 작성해야할지 감이 오지 않았다.

DAO에 의존이 걸린 Service를 대체 어떻게 테스트하면 좋을까?

 


Mockito라이브러리를 사용해보자

class RacingGameServiceTest {

    private RacingGameService racingGameService;
    private PlayerDao playerDao;
    private RacingGameDao racingGameDao;

    @BeforeEach
    void setUp() {
        racingGameDao = Mockito.mock(RacingGameDao.class);
        playerDao = Mockito.mock(PlayerDao.class);
        racingGameService = new RacingGameService(racingGameDao, playerDao);
    }
    
    ...

Mockito라이브러리를 사용하여 서비스 계층을 스프링 부트에 의존적이지 않게 테스트를 할 수 있었다.

 

더욱 신기했던 것은 메서드의 반환 값을 자유자재로 바꿀 수 있었는데,

import static org.mockito.BDDMockito.*;

위의 라이브러리를 이용하는 것이었다.

given().willReturn()

given에 원하는 메서드를 넘겨주고, willReturn에서는 given에 주어진 메서드의 원하는 반환 값을 넣어주면 된다.

given(racingGameDao.save(jeomoon, trial)).willReturn(racingGameId);

이렇게 사용하면 내가 원하는 메서드를 통해 원하는 반환을 얻어낼 수 있어서,

테스트를 작성하기 훨씬 편했다.

특히나 서비스에는 DAO에 의존이 걸려있기때문에 따로 DAO에 대한 작업을 하지 않아도 돼서 편했다.

 

이제 여기서 궁금했던 점은 Mockito와 BDDMockito의 차이점이었다.

기존 Mockito에서는 given().willReturn()방식이 아닌, when().thenReturn()의 방식을 사용했다.

when(racingGameDao.save(jeomoon, trial)).thenReturn(racingGameId);

하지만 이런 방식으로 테스트를 작성하게 될 경우, 테스트의 가독성이 현저히 떨어진다는 단점이 있다.

더 자세하게 말하자면 given, when, then패턴 형식의 단위 테스트에서

given에 해당하는 부분에 when().thenReturn()이 사용되고, 이는 혼란을 야기할 수 있다.

BDDMockit를 사용한 테스트 코드

위의 예시처럼 BDDMockito를 사용했을 경우 given패턴에 given메서드가 있기 때문에 훨씬 가독성이 증가한다.

 

 

그래서 BDDMockito는 왜 있을까?

Mockito라는 것이 있는데도 불구하고 BDDMockito라는 것이 왜 존재할까?

먼저 BDD(Behavior Driven Development)는 해석하자면 행위 주도 개발이다.

즉, 실제 사용자들이 어떻게 사용할지에 대한 시나리오를 바탕으로 개발하는 방식인 셈이다.

 

BDDMockito를 확인해보면 Mockito를 상속받는 구조이다.

즉, 기존에 있던 Mockito에서 개선점을 가져갔다는 의미로 받아들일 수 있다.

BDD에서는 given, when, then패턴을 가져가는데,

테스트 코드를 작성할 때 마찬가지로 given, when, then패턴을 가져간다.

따라서 given절에 when,then이 나오는 기존의 Mockito보다 BDDMockito를 사용함으로써

가독성 좋은, 시나리오 중심의 테스트를 작성할 수 있다는 장점이 있다.

 

*잘못된 내용이 있다면 댓글 남겨주시는대로 수정하겠습니다.

참고 자료 출처
https://www.baeldung.com/bdd-mockito
https://tecoble.techcourse.co.kr/post/2020-09-29-compare-mockito-bddmockito/
https://www.popit.kr/bdd-behaviour-driven-development%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%84%EB%9E%B5%ED%95%9C-%EC%A0%95%EB%A6%AC/

 

'Spring > Test' 카테고리의 다른 글

RestAssured와 MockMvc중 어떤 걸 써야할까?  (0) 2023.05.10