mockitoでスタティッククラスをmock化する方法や、mock化されたオブジェクトをSpyする方法は検索すると結構ひっかかったのですが、Staticクラスの1部のメソッドだけをmock化する方法がなかなか見つからなかったので自分用にメモ。
@RunWith(PowerMockRunner.class)
@PrepareForTest({DateUtil.class, ... })
public class AAATest {
@Before
public void setUp() throws Exception {
PowerMockito.spy(DateUtil.class);
}
@Test
public void test() {
Date systemDate = DateUtil.toDate("2015/01/01"); // Mockの戻り値
// Mockの振る舞い定義は前置記法で2行続けて記述する
PowerMockito.doReturn(systemDate).when(DateUtil.class);
DateUtil.getSystemDate(); // この呼び出しがMock化される
Date expectedDate = DateUtil.toDate("2015/01/01")
Assert.assertThat(DateUtil.getSystemDate(), is(expectedDate))
}
Static#getSystemDate()の呼び出しはMock化され、それ以外のメソッドDateUtil#toDate(String)等の呼び出しは実際のロジックが呼び出されるようになります。
その他気づいたこと
new
- コンストラクタ(new)をMock化するときは@prepareForTestにテスト対象のクラスを設定しないと動作しない。
static method
- newのMock化を使用せず、static methodだけのMock化ならば@prepareForTestにテスト対象を追加しないほうがいい。
- Jacoco(EclEmma)などを使用してカバレッジを採ることができる。