Mockitoを利用したテスト時に、privateメソッドをモック化した場合のメモになります。
事前準備
今回のテスト用に以下のコードを作成します。
- Personクラス:privateフィールドを持ちprivateメソッド(getPersonName)を実装
// Person.java public class Person { private String name = "foo"; private String getPersonName() { return name; } }
テストコードの作成
以下が作成したテストコードとなります。
// PersonTest.java @RunWith(PowerMockRunner.class) @PrepareForTest(Person.class) public class PersonTest { private Person person = new Person(); @Before public void setup() { MockitoAnnotations.openMocks(this); person = spy (new Person()); } @After public void tearDown() throws Exception { } @Test public void testGetPersonName() { String result = null; try { PowerMockito.when(person, "getPersonName").thenReturn("bar"); result = (String) Whitebox.invokeMethod(person, "getPersonName"); } catch (Exception e) { e.printStackTrace(); fail(); } MatcherAssert.assertThat(result, CoreMatchers.is("bar")); } }
@PrepareForTest
でモック対象のクラスを指定し、spy()
で対象のメソッドをモック化します。
そして、when("テストクラス", "メソッド名", "引数").thenReturn()
で実行時の挙動を指定しています。
難点としては、@PrepareForTest
をし利用した場合、対象クラスのカバレッジが取れないため、こちらも取る必要がある場合はリフレクションを使用するなどの工夫が必要となります。