웹사이트 검색

Mockito Mock Void 메서드


대부분의 경우 Mockito when() 메서드는 객체의 동작을 조롱하기에 충분합니다. 그러나 void 메서드를 조롱해야 하는 경우에는 when()을 사용할 수 없습니다.

Mockito Mock Void 메서드

Mockito는 void 메서드를 조롱하는 데 사용할 수 있는 다음 메서드를 제공합니다.

  1. doAnswer(): void를 반환하는 모의 개체 메서드가 호출될 때 일부 작업을 수행하는 데 사용할 수 있습니다.
  2. doThrow(): 예외를 발생시키는 void 메서드를 스텁(stub)하려는 경우 doThrow()를 사용할 수 있습니다.

테스트 클래스에서 조롱할 void 메서드가 있는 간단한 클래스를 만들어 봅시다.

package com.journaldev;

public class Employee {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		if (name == null)
			throw new IllegalArgumentException("Employee Name can't be null");
		this.name = name;
	}

}

Mockito 모의 void 메서드 예제

Mockito doAnswer() 메서드는 Answer를 인수로 사용합니다. 구현을 위한 람다 식입니다.

doAnswer((i) -> {
	System.out.println("Employee setName Argument = " + i.getArgument(0));
	assertTrue("Pankaj".equals(i.getArgument(0)));
	return null;
}).when(emp).setName(anyString());

return null 문은 void 메서드를 모의하기 때문에 필요합니다.

예외가 있는 Mockito 모의 무효 메서드

아래 코드 조각은 doThrow() 메서드를 사용하여 예외가 있는 void 메서드를 모의하는 방법을 보여줍니다.

doThrow(IllegalArgumentException.class).when(emp).setName(null);

JUnit Mockito 모의 void 메서드 예제

다음은 Mockito를 사용하여 void 메서드를 조롱하는 JUnit의 완전한 예입니다.

package com.journaldev.mockito.voidmethod;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;

import com.journaldev.Employee;

class JUnitMockitoVoidMethod {

	@Test
	void test_mockito_void() {
		Employee emp = mock(Employee.class);

		doThrow(IllegalArgumentException.class).when(emp).setName(null);

		doAnswer((i) -> {
			System.out.println("Employee setName Argument = " + i.getArgument(0));
			assertTrue("Pankaj".equals(i.getArgument(0)));
			return null;
		}).when(emp).setName(anyString());

		when(emp.getName()).thenReturn("Pankaj");

		assertThrows(IllegalArgumentException.class, () -> emp.setName(null));

		emp.setName("Pankaj");
		assertEquals("Pankaj", emp.getName());
	}

}

TestNG Mockito void 메서드 예제

JUnit 5와 TestNG 주석은 매우 유사하기 때문에 JUnit 5에서 TestNG로 전환하기 위해 위 클래스의 코드별 변경 사항이 필요하지 않습니다. JUnit 5 가져오기 문을 제거하고 아래 가져오기를 추가하여 테스트 프레임워크를 JUnit에서 TestNG로 변경하십시오.

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.assertTrue;

import org.testng.annotations.Test;

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