読者です 読者をやめる 読者になる 読者になる

SpringのDI + PowerMockでのテスト

Java テスト

いままではテスト対象クラスで定義している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));
    }