ウェブサイト検索

Mockito Mock Void メソッド


ほとんどの場合、Mockito の when() メソッドは、オブジェクトの動作をモックするのに十分です。しかし、void メソッドをモックする必要がある場合は、when() を使用できません。

Mockito Mock Void メソッド

Mockito は、void メソッドをモックするために使用できる次のメソッドを提供します。

  1. doAnswer(): void を返すモック オブジェクト メソッドが呼び出されたときに、これを使用していくつかの操作を実行できます。
  2. doThrow(): 例外をスローする void メソッドをスタブ化したい場合は、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());

void メソッドをモックしているため、return null ステートメントが必要であることに注意してください。

例外のあるMockitoモックvoidメソッド

以下のコード スニペットは、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 リポジトリからダウンロードできます。

関連記事: