#概要
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) 返却するオブジェクト