Engineering Note

プログラミングなどの技術的なメモ

privateメソッドのモック化

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をし利用した場合、対象クラスのカバレッジが取れないため、こちらも取る必要がある場合はリフレクションを使用するなどの工夫が必要となります。

 

参考書籍

Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで