저번에 이어서 mockito에 대해 설명을 할까 한다.
저번 junit 테스트 했을 때는 일일히 게시판쓰기를 통해서 db에 데이터가 추가가 되고 그걸가지고 테스트를 하였는데, 매번 그렇게 하면 번거로운 부분도 있고, 상황에 따라서 데이터를 맞춰야하는 부분도 생긴다.
mockito를 이용하면, 굳이 맞출려고 할 필요없이 어떤 예측한 값이 나온다고 가정을 해서 개발자가 정할 수 있게 되서, 테스트를 하는데 좀 더 편리하게 할 수 있는 장점을 가진다.
일단 mockito 정의를 보면?
- Mockito란 가짜(Mock) 객체를 지원하는 테스트 프레임워크
- @ExtendWith(MockitoExtension.class) 어노테이션을 테스트 클래스에 붙여 사용할 수 있다.
- 유닛테스트를 할 때, 위의 Mockito를 통해 클래스 내의 멤버 변수(객체)를 Mock객체로 임의로 구현함으로써 테스트의 범위를 유닛테스트에 알맞는 범위로 설정할 수 있다.
- Mockito의 when, verfiy, spy 등을 활용하여 더욱 더 간결하고 쉬운 유닛테스트를 작성할 수 있지만, 개발자가 정해진 리턴값을 정해줘야 한다.
문법
- @Mock - 주입될 가상의 mock 객체를 직접 만들어서 반환해주는 어노테이션,
- @Spy - 실제 객체를 사용해서 mock를 하는 어노테이션
- @InjectMocks: @Mock 또는 @Spy로 생성된 가짜 객체를 자동으로 주입시켜주는 어노테이션
상황
현재 DB구성이 안되어있는 상태고, 게시판 상세보기 기능 중 "boardService" 메소드를 테스트를 하고 싶은데, DB가 구성될떄까지는 테스트를 못하는 상황
조치방법
DB 부분을 @Mock로 주입시켜 리턴값을 정하여 테스트 진행
@ExtendWith(MockitoExtension.class)
public class MockitoTest {
private static final Logger logger = LoggerFactory.getLogger(Class1Tests.class);
@Mock
private BoardRepository boardRepository;
@InjectMocks
private BoardService BoardService;
@Test
@DisplayName("Mock 테스트")
public void mockTest() {
logger.info("mockTest");
Optional<BoardEntity> board = Optional.of(
BoardEntity.builder()
.title("테스트")
.author("테스터")
.content("테스트를 합시다")
.build());
when(boardRepository.findById(1L)).thenReturn(board);
assertEquals(BoardService.getPost(1L).getAuthor(), "테스터");
// findById가 최소 1번이상 호출되었는지 검증
verify(boardRepository, atLeastOnce()).findById(1L);
}
}
소스처럼 한번만 하면 초록색 메뉴바가 뜨지만, "verify(boardRepository, atLeast(2)).findById(1L);"를 하게 되면 빨간색이 뜨면서 테스트 실패가 나타나게 된다.
이렇게 몇번 테스트해보면서 느낀점이 mockito를 제대로 알고 사용하는게 맞는거 같다. mockito가 많이 사용한다는건 그만큼 의존성이 높다는 증거고 결합도가 높다는거라고 생각한다. 그리구 mockito는 가짜 객체이고 개발자가 임의로 리턴값을 지정해주는 부분이기 때문에 테스트는 통과될수 있지만 실제 테스트에서는 오류가 발생하는 경우가 있을거 같다.
그래서 이 부분을 고려해서 테스트 코드를 만들면 괜찮을거 같기도 하다.
'spring' 카테고리의 다른 글
SpringBoot에서 이해하기 쉬운 IOC(Inversion of Control) 살펴보기 (0) | 2023.05.21 |
---|---|
spring framework를 사용하는 이유 (0) | 2023.03.19 |
Junit 개념 및 활용 (0) | 2021.07.24 |
Springboot aop 기본개념 및 예제 (0) | 2021.07.17 |
[Springboot] Logback 사용하기 (0) | 2021.03.21 |