できたと思ってたのはEasyMockをうまく騙せて、Partial Mockインスタンスを作成できたというだけでした。デバッグしてみると実際のprivateメソッドが呼ばれてしまうのでダメでした。誤解を与える記事を書いてしまい、すみませんでした。
ネタ的な感じで振られたので、思い付きでやってみた。PowerMockとかいうEasyMock拡張ライブラリでも同様のことができるみたい。需要はそこそこあるのかしら。
以下のようにpublicメソッド内でprivateメソッドを呼び出している。
Sample.java
public void hoge() {
fuga();
}
private void fuga() {
// do something
}
このときに、fuga()メソッドをモック化したい場合、通常のEasyMockの使い方ではprivateメソッドはモック化できないけど、以下のようにすれば一応モック化できる。
SampleTest.java
public class SampleTest extends EasyMockSupport {
private Sample testee;
@Test
public void testHoge() throws Exception {
Methog fuga = Sample.class.getDeclaredMethod("fuga");
testee = createMockBuilder(Sample.class).addMockedMethod(fuga).createMock();
// 可視性を強制的にpublicにする
fuga.setAccessible(true);
fuga.invoke(testee);
replayAll();
testee.hoge();
verifyAll();
}
}
奥の手だから、本来はこんなハックはするべきじゃない。