Mockito Mock Void Method - huongpt-1499/android_testing_samplecode GitHub Wiki

Hầu hết trong mọi trường hợp Mockito when() đủ tốt để mock một hành vi của một đối tượng. Nhưng khi chúng ta mock một phương thức void, chúng ta không thể sử dụng when() cho trường hợp này

Mockito Mock Void Method

Mockito cung cấp hàm sử dụng để mock một phương thức void.

doAnswer(): Chúng ta có thể sử dụng điều này để thực hiện một số thao tác khi một đối tượng mock được gọi và trả về void. doThrow(): chúng ta có thể sử dụng doThrow() khi muốn một phương thức void ném ra một ngoại lệ. Hay theo dõi ví dụ dưới đây

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 mock void method example

Phương thức Mockito doAnswer() lấy Answer như một đối số.

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

Lưu ý rằng câu lệnh null trả về là bắt buộc vì chúng ta đang mock phương thức void.

Mockito mock void method with exception

Đoạn mã dưới đây cho thấy cách sử dụng phương thức doThrow () để giả định các phương thức void với ngoại lệ

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

JUnit Mockito mock void method

Dưới đây là ví dụ trong JUnit , tôi sử dụng Mockito để mock một phương thức void

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());
	}

}