웹사이트 검색

Mockito 튜토리얼


Mockito는 Java Reflection API와 같은 다른 테스트 프레임워크와 함께 사용되는 Java 기반 모의 프레임워크이며 서비스 객체를 생성할 수 있습니다. 모의 개체는 더미 데이터를 반환하고 외부 종속성을 방지합니다. 외부 종속성을 조롱하고 모의를 테스트 중인 코드에 적용하여 테스트 개발을 단순화합니다.

Mockito 튜토리얼

Mockito 튜토리얼의 경우 JUnit 5를 사용하고 조롱할 서비스를 만들 것입니다.

Mockito Maven 종속성

프로젝트에서 Mockito 기반 테스트 사례를 구현하려면 프로젝트의 pom.xml 파일에 다음 종속성을 추가합니다.

<dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-core</artifactId>
     <version>2.19.0</version>
     <scope>test</scope>
</dependency>
<dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-junit-jupiter</artifactId>
     <version>2.19.0</version>
     <scope>test</scope>
</dependency>

mockito-junit-jupiter는 JUnit 5에 필요합니다. JUnit 4 또는 TestNG와 같은 다른 테스트 프레임워크를 사용하는 경우 이 종속성을 제거하고 mockito-core만 포함합니다. 코드> 종속성.

Mockito 모의 생성

Mockito 프레임워크를 사용하면 @Mock 주석 또는 mock() 정적 메서드를 사용하여 목 객체를 만들 수 있습니다.

Mockito mock() 메소드

아래 예제는 mock() 메서드의 사용법을 보여줍니다.

package com.journaldev.mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import com.journaldev.AddService;
import com.journaldev.CalcService;

public class CalcService1Test {

	@Test
	void testCalc() {
		System.out.println("**--- Test testCalc executed ---**");

		AddService addService;
		CalcService calcService;

		addService = Mockito.mock(AddService.class);
		calcService = new CalcService(addService);

		int num1 = 11;
		int num2 = 12;
		int expected = 23;

		when(addService.add(num1, num2)).thenReturn(expected);

		int actual = calcService.calc(num1, num2);

		assertEquals(expected, actual);

	}
}

위의 예에서는 CalcService를 테스트하고 있습니다. Mockito.mock() 메서드는 AddService 클래스의 목 객체를 생성하는 데 사용됩니다.

Mockito 모의 주석

아래 예는 @Mock 주석의 사용법을 보여줍니다.

package com.journaldev.mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import com.journaldev.AddService;
import com.journaldev.CalcService;

public class CalcService2Test {

	CalcService calcService;

	@Mock
	AddService addService;

	@BeforeEach
	public void setup() {
		MockitoAnnotations.initMocks(this);
	}

	@Test
	public void testCalc() {
		System.out.println("**--- Test testCalc executed ---**");

		calcService = new CalcService(addService);

		int num1 = 11;
		int num2 = 12;
		int expected = 23;

		when(addService.add(num1, num2)).thenReturn(expected);

		int actual = calcService.calc(num1, num2);

		assertEquals(expected, actual);

	}
}

@InjectMocks 주석이 달린 개체를 초기화하려면 MockitoAnnotations.initMocks(this);를 호출해야 합니다.

Mockito 동작 검증

모의 클래스에 동작을 추가하려면 when()thenReturn() 함수가 사용됩니다. 이것은 모의 개체(addService)가 (num1, num2) 매개변수가 있는 add 메서드에 대해 호출될 때 예상되는 변수에 저장된 값을 반환한다는 것을 의미합니다. CalcService 클래스는 다음과 같습니다.

public class CalcService {
	
	private AddService addService;
	
	public CalcService(AddService addService) {
		this.addService = addService;
	}

	public int calc(int num1, int num2) {
		System.out.println("**--- CalcService calc executed ---**");
		return addService.add(num1, num2);
	}

}

CalcService에는 AddService 클래스에 대한 종속성이 있습니다. AddService 클래스의 add 메서드를 사용하여 작업을 수행합니다. CalcService 클래스의 단위 테스트만 수행하려고 했기 때문에 AddService 인스턴스를 모의 처리해야 합니다. AddService는 다음과 같습니다.

public interface AddService {
	public int add(int num1, int num2);
}
public class AddServiceImpl implements AddService {
	@Override
	public int add(int num1, int num2) {
		System.out.println("**--- AddServiceImpl add executed ---**");
		return num1 + num2;
	}
}

Mockito 확인 상호 작용

Mockito 프레임워크는 모의 개체에 대한 모든 메서드 호출과 해당 매개 변수를 추적합니다. 목 객체의 Mockito verify() 메서드는 메서드가 특정 매개변수로 호출되는지 확인합니다. 또한 정확한 횟수, 최소 지정된 횟수, 지정된 횟수 미만 등과 같은 호출 논리 수를 지정할 수 있습니다. 호출 횟수에 대해 VerificationModeFactory를 사용할 수 있습니다. 시간 논리. Mockito verify() 메서드는 메서드가 올바른 매개변수로 호출되는지 확인합니다. assert 메서드와 같은 메서드 호출 결과를 확인하지 않습니다. 아래 예제는 verify() 메서드의 사용법을 보여줍니다.

package com.journaldev.mockito;

import static org.mockito.Mockito.verify;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.mockito.internal.verification.VerificationModeFactory;

public class VerifyInteractionTest {
	@Test
	public void testMethod() {
		@SuppressWarnings("unchecked")
		List<String> mockedList = Mockito.mock(List.class);

		mockedList.add("first-element");
		mockedList.add("second-element");
		mockedList.add("third-element");
		mockedList.add("third-element");
		mockedList.clear();

		verify(mockedList).add("first-element");
		verify(mockedList).add("second-element");
		verify(mockedList, VerificationModeFactory.times(2)).add("third-element");

		verify(mockedList).clear();
	}

}

Mockito 스텁 콘크리트 클래스

when() - thenReturn() 함수를 사용하여 구체적/구현 클래스와 컬렉션의 단일 요소를 스텁할 수 있습니다. 스텁되지 않은 요소에는 null이 포함됩니다.

package com.journaldev.mockito;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.ArrayList;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class MockSingleElementTest {
	@SuppressWarnings("unchecked")
	@Test
	public void testMethod() {
		ArrayList mockedList = mock(ArrayList.class);

		when(mockedList.get(0)).thenReturn("first-element");

		System.out.println(mockedList.get(0));
		assertEquals("first-element", mockedList.get(0));
		
		// "null" gets printed as get(1) is not stubbed
		System.out.println(mockedList.get(1));
	}

}

모키토 스파이

스파이 개체의 메서드를 호출하면 사전 정의된 동작이 정의되지 않은 한 실제 메서드가 호출됩니다. spy를 사용하면 when() - theReturn() 함수를 사용하여 동작을 정의하거나 실제 구현을 호출할 수 있습니다.

package com.journaldev.mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;

public class MockitoSpyTest {

	@Test
	public void testMethod() {
		List<String> list = new ArrayList<>();
		List<String> listSpy = spy(list);

		listSpy.add("first-element");
		System.out.println(listSpy.get(0));

		assertEquals("first-element", listSpy.get(0));
		when(listSpy.get(0)).thenReturn("second-element");
		System.out.println(listSpy.get(0));
		assertEquals("second-element", listSpy.get(0));
	}

}

결론

Mockito는 Java 단위 테스트를 위한 인기 있는 조롱 프레임워크입니다. Mockito를 사용하여 종속성을 쉽게 모의할 수 있습니다. Mockito 코딩 스타일은 유창하고 JUnit 및 TestNG 프레임워크와 유사하므로 학습 곡선이 매우 작습니다.

GitHub 리포지토리에서 전체 프로젝트 코드를 다운로드할 수 있습니다.