1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【誤りでした】EasyMockでprivateメソッドをモック化

Last updated at Posted at 2014-02-13

できたと思ってたのは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();
    }
}

奥の手だから、本来はこんなハックはするべきじゃない。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?