Mockito를 이용하여 단위테스트 구현하기

Minkyeong Kim·2021년 11월 22일
0

[boostcourse] Web-Backend

목록 보기
29/55

통합테스트와 단위테스트

  • 통합 테스트
    하나의 빈을 테스트할 때 관련된 빈들이 모두 잘 동작하는지 테스트하는 것
  • 단위 테스트
    관계된 다른 클래스와 상관 없이 특정 빈이 가지고 있는 기능만 잘 동작하는지 테스트하는 것

1) MyService 클래스 생성

MyService.java

package org.edwith.webbe.calculatorcli;

import org.springframework.stereotype.Service;

@Service
public class MyService {
	private final CalculatorService calculatorService;
	
	public MyService(CalculatorService calculatorService) {
		this.calculatorService=calculatorService;
	}
	public int execute(int v1, int v2) {
		return calculatorService.plus(v1, v2) * 2;
	}
}
  • @Service 어노테이션을 사용
  • CalculatorService의 객체를 사용하는 클래스

2) MyServiceTest 클래스 생성

Mockito

오픈소스 목 프레임워크
테스트를 위한 가짜(Mock) 객체를 쉽게 만들 수 있도록 함

Mock이 왜 필요한가?

현재 진행중인 예제에 빗대어보자면, MyService에서 CalculatorService 객체를 직접 가져와 사용하는 대신, 가짜 객체(Mock)을 생성하여 원하는 동작(CalculatorService의 동작)을 Mock 객체에서 실행하여 MyService 내용만 테스트할 수 있음

MyServiceTest.java

package org.edwith.webbe.calculatorcli;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;

import static org.mockito.Matchers.anyInt;


//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = {ApplicationConfig.class})

@RunWith(MockitoJUnitRunner.class) // mockito가 제공하는 JUnit확장 클래스를 이용해 테스트 클래스 실행
public class MyServiceTest {
	//@Autowired
	@InjectMocks // Mock 객체를 사용하는 MyService 객체를 생성해 초기화
	MyService myService;
	
	@Mock // calculatorService가 Mock 객체를 참조하도록 함
	CalculatorService calculatorService;
	
	@Test
	public void execute() throws Exception{
		//given
		int v1 = 5;
		int v2 = 10;
		// org.mockito.BBDMockito.given: Mock 객체가 동작하는 방법을 규정하는 메소드
        	// 보통 static 함수로 import해서 사용함
		// Mock 객체에서 plus연산이 잘 작동하는지 확인
		org.mockito.BDDMockito.given(calculatorService.plus(5, 10)).willReturn(15);
		
		//when
		int result = myService.execute(v1, v2);
		
		//then
		// verify: 파라미터로 들어온 객체의 plus 메소드가 (int, int)를 입력받아 호출된 적 있는지 검증
		org.mockito.Mockito.verify(calculatorService).plus(anyInt(), anyInt());
		Assert.assertEquals(30, result);
	}
}
  • 만약 MyService에서 CalculatorService 객체의 plus 메소드를 사용해 execute연산을 하지 않는다면, verify부분에서 에러 발생

  • given을 없애면 verify부분에서 에러 발생 -> 쌍으로 작성해야 할듯

  • MyService의 execute 메소드에서 사용되는 CalculatorService의 메소드가 plus이므로, plus 연산에 대해 given, verify를 하여 Mock 객체의 동작을 추적함

0개의 댓글