モキートのvoidメソッドをモック化する
ほとんどの場合、Mockitoのwhen()メソッドはオブジェクトの動作をモックするのに十分です。しかし、voidメソッドをモックする必要がある場合、when()は使用できません。
モッキートを使用して、voidメソッドをモック化する
モキートは、voidメソッドをモックするために使用できる以下のメソッドを提供しています。
-
- doAnswer():モックオブジェクトのメソッドが呼び出され、voidを返す場合に、いくつかの操作を実行するためにこれを使用することができます。
- doThrow():例外をスローするvoidメソッドをスタブ化したい場合に、doThrow()を使用することができます。
テストクラスでモックするために、voidメソッドを持つシンプルなクラスを作成しましょう。
package com.scdev;
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;
}
}
モックitoの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());
ヴォイドメソッドをモックしているため、nullを返す文が必要であることに注意してください。
例外を持つvoidメソッドをMockitoでモックする。
以下のコードスニペットは、doThrow() メソッドを使用して例外を持つ void メソッドをモック化する方法を示しています。
doThrow(IllegalArgumentException.class).when(emp).setName(null);
以下は、JUnit Mockitoを使用したvoidメソッドのモックの例です。
私がMockitoを使ってvoidメソッドをモックする完全なJUnitの例を紹介します。
package com.scdev.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.scdev.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リポジトリから、完全なプロジェクトコードをダウンロードすることができます。