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

복사했습니다!