LoginSignup
38
33

More than 5 years have passed since last update.

PowerMockを使ってメソッド内で生成されるインスタンスをモックに置き換える

Last updated at Posted at 2015-10-17

概要

JUnitを使用して、メソッドのテストを行うとき
対象となるメソッド内で別クラスのインスタンスを生成している場合がある
この別クラスを、どうしてもMockにしたい場合は下記の手順で行う。

バージョン

  • java 1.8
  • junit 4.1.2
  • Mockito 1.10.19
  • PowerMock 1.6.2

下記サイトからダウンロード
https://code.google.com/p/powermock/wiki/Downloads

テスト対象のクラス

Taisyou.java
package sample;

public class Taisyou {

    public String search() {
        Util util = new Util();

        return util.get();
    }
}
Util.java
package sample;

public class Util {

    public String get() {
        return "Util get";
    }
}

Taisyouクラスのsearchメソッドで、Utilクラスのコンストラクタを呼び出してインスタンスを生成している
このような、メソッド内で実行されるコンストラクタの戻り値をMockに置き換えてテストをしたい。

テストクラス

UtilTest.java
package sample;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Taisyou.class})
public class TaisyouTest {

    /** テスト対象 */
    private Taisyou taisyou;

    /**
     * 初期処理
     */
    @Before
    public void setup() {
        this.taisyou = new Taisyou();
    }

    /**
     * テスト
     */
    @Test
    public void searchTest() throws Exception {
        // テスト対象メソッド内で呼び出されるコンストラクタで返すモックオブジェクト生成
        Util mock = Mockito.mock(Util.class);
        Mockito.doReturn("test").when(mock).get();

        // Utilクラスのコンストラクタで返されるインスタンスをモックに変更
        PowerMockito.whenNew(Util.class).withNoArguments().thenReturn(mock );

        // テスト対象の実行
        String result = this.taisyou.search();

        // 評価
        Assert.assertSame(result, "test");
    }
}

コンストラクタを偽装

PowerMockito.whenNew(Util.class).withNoArguments().thenReturn(mock);

whenNew(Util.class) で対象のクラスを指定
withNoArguments() は引数なしのコンストラクタの場合
 ※引数ありの場合は、withArguments(anyString()) などとする
thenReturn(mock) 返却するオブジェクト

38
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
33