できたと思ってたのはEasyMockをうまく騙せて、Partial Mockインスタンスを作成できたというだけでした。デバッグしてみると実際のfinalメソッドが呼ばれてしまうのでダメでした。誤解を与える記事を書いてしまい、すみませんでした。
ネタ感満載。
finalメソッドをモック化したい場合。PowerMock使えないけどなんとかしたいとかそんなときに。
Sample.java
public void hoge() {
finalMethod();
}
public final void finalMethod() {
// do something
}
final修飾子をなかったことにすればいい。
SampleTest.java
public class SampleTest extends EasyMockSupport {
private Sample testee;
@Test
public void testHoge() throws Exception {
Method finalMethod = Sample.class.getMethod("finalMethod");
Field modifiers = finalMethod.getClass().getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.set(finalMethod, Modifier.PUBLIC.ordinal());
modifiers.setAccessile(false);
testee = createMockBuilder(Sample.class).addMockedMethod(finalMethod).createMock();
testee.finalMethod();
replayAll();
testee.hoge();
verifyAll();
}
}
FW開発ならまだしも、通常のアプリ開発でfinalって見ないなー。