Mockito 란?
- 자바 기반의 mocking 프레임워크
- mock object를 creation, verification, stubbing 한다.
mocking 은 조롱이라는 의미인데,
mockito 를 사용하면 디비 연결 등의 실제 서비스 환경과 관계 없이 독립적으로 클래스의 기능을 테스트할 수 있다.
실제 서비스를 조롱하듯이 개발자가 마음대로 객체를 관리하는 테스트 방법을 뜻한다.
튜토리얼 사이트에서 가져 온 아래 예제를 보자.
여러 주식의 값을 개발자의 임의대로 셋팅하여 StockService 를 단위 테스트할 수 있다.
import static org.mockito.Mockito.*;
public class PortfolioTester {
public static void main(String[] args){
// 테스트를 위한 주식 포트폴리오 객체를 생성한다.
Portfolio portfolio = new Portfolio();
// 포트폴리오 객체에 추가할 주식 목록을 생성한다.
List<Stock> stocks = new ArrayList<Stock>();
Stock googleStock = new Stock("1","Google", 10);
Stock microsoftStock = new Stock("2","Microsoft",100);
stocks.add(googleStock);
stocks.add(microsoftStock);
// StockService mock 객체 (모형) 생성!
StockService stockServiceMock = mock(StockService.class);
// stock service 가 리턴할 다양한 주식 가격 정의 ( 이를 stubbing 이라고 한다. )
when(stockServiceMock.getPrice(googleStock)).thenReturn(50.00);
when(stockServiceMock.getPrice(microsoftStock)).thenReturn(1000.00);
// 포트폴리오 객체에 주식 목록 셋팅
portfolio.setStocks(stocks);
// 포트폴리오 객체에 stock service mock 객체 셋팅
portfolio.setStockService(stockServiceMock);
double marketValue = portfolio.getMarketValue();
// 시장 가격 검증
// 10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
System.out.println("Market value of the portfolio: "+ marketValue);
}
}
이제 mockito 에서 사용하는 몇 가지 메서드에 대해 알아보자.
- when()
when() 메서드를 이용하여 mock object 의 행동을 정의할 수 있다.
// calc service 의 add 메서드에 10 과 20 을 더하는 동작을 제공하고, 30.00 을 리턴하도록 정의
when(calcService.add(10.0,20.0)).thenReturn(30.00);
- any()
any() 메서드를 이용하면, 모든 매개 변수에 대하여 같은 값을 리턴하는 mock object 를 생성할 수 있다.
// findById 에 어떤 매개변수가 들어와도 true 를 리턴하게 된다.
given(userService.findById(any())).thenReturn(true);
- verify()
verify() 메서드를 사용하여 메서드 호출 횟수를 테스트할 수 있다.
@Test
void test() {
List<String> mockList = mock(List.class);
mockList.add("yuna");
mockList.size();
verify(mockList).add("yuna");
}
해당 기능이 1번 사용되었다면 테스트를 통과한다.
위 소스코드는 아래와 같은 의미이다.
verify(mockList, times(1)).size();
- 예외처리
doThrow(new Runtime Exception("divide operation not implemented"))
.when(calcService).add(10.0,20.0);
- spy()
클래스의 메서드들 중에 하나는 stub 하고 하나는 실제 기능을 그대로 사용하고 싶은 경우 사용한다.
스파이 객체의 메서드를 호출할 때 미리 동작이 정의되지 않았다면 실제 메서드가 호출된다.
(참고) https://cobbybb.tistory.com/16
// 실제 객체의 스파이를 생성한다.
calcService = spy(calculator);
BDD (Behavior Driven Development)
행동 주도 개발의 약어로, 다음 형식을 지켜 테스트한다.
// 주어진 상황에서
given(calcService.add(20.0,10.0)).willReturn(30.0);
// 사건이 발생했을 때
double result = calcService.add(20.0,10.0);
// 아래를 수행한다.
Assert.assertEquals(result,30.0,0);
참고
https://www.tutorialspoint.com/mockito/index.htm
https://www.digitalocean.com/community/tutorials/mockito-tutorial#mockito-tutorial
'Spring Boot' 카테고리의 다른 글
[Spring Boot] Maven Multi Module (0) | 2022.12.16 |
---|---|
[Spring Boot] AWS S3 이미지파일 업로드하기 (0) | 2022.09.03 |
Spring Security 인가 처리 - AccessDecisionManager, AccessDecisionVoter (0) | 2022.08.04 |
Spring Security 인증 처리 (2) Filter, AuthenticationManager, AuthenticationProvider, WebSecurityConfigure (0) | 2022.07.26 |
Spring Security 인증 처리 (1) Authentication, SecurityContextHolder (0) | 2022.07.23 |