いままではテスト対象クラスで定義しているDI部分をEasyMockで、staticメソッドのMockをPowerMockで書くことがほとんどでした。
昨日テストケースを書くときに@PostConstructで定義されている部分があったので、普通にDIを使って書いてたのですが、staticメソッドのMockをどうするんだろう?と。
PowerMockのwikiをみるとPowerMockRuleとPowerMockAgentの2パターンがあるよと書いてあったので、最初は前者で書いて実行するとXMLパーサーでエラーが出たので断念。
サンプルコードはこんな感じ
/** * このクラスのテストを行うためには、下記の2つのJVMオプションが必要 * https://code.google.com/p/powermock/wiki/PowerMockAgent * <pre> * -javaagent:$HOME/.m2/repository/org/powermock/powermock-module-javaagent/1.5.2/powermock-module-javaagent-1.5.2.jar * -noverify * </pre> */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-test.xml"}) @PrepareForTest(Utils.class) public class TestClass { @Autowired private Tester tester; @Rule public PowerMockRule rule = new PowerMockRule(); @Test public void test(){ Long userId = 1L; Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(2013, Calendar.OCTOBER, 30); Date from = cal.getTime(); PowerMock.mockStaticPartial(Utils.class, "getCurrentDate"); cal = Calendar.getInstance(); cal.clear(); cal.set(2013, Calendar.DECEMBER, 1); EasyMock.expect(Utils.getCurrentDate()).andReturn(cal.getTime()); PowerMock.replay(Utils.class); List<Example> list = tester.select(userId, from); assertThat(list.size(), is(30)); }