34

次のようなクラスがあるとします。

public class StaticDude{
    public static Object getGroove() {
        // ... some complex logic which returns an object
    };
}

簡単なモックを使用して静的メソッド呼び出しをモックするにはどうすればよいですか? StaticDude.getGroove().

easy mock 3.0を使っています

4

5 に答える 5

26

純粋な EasyMock を使用する方法はわかりませんが、PowerMock拡張機能を EasyMock に使用することを検討してください。

必要なことだけを行うためのクールな機能がたくさんあります - https://github.com/jayway/powermock/wiki/MockStatic

于 2010-07-02T00:44:20.633 に答える
11

Easymock は「インターフェイス (およびクラス拡張によるオブジェクト) 用」のテスト フレームワークであるため、インターフェイスなしでクラスをモックできます。静的クラスのアクセサーを使用してインターフェイス オブジェクトを作成し、代わりにそのアクセサーをモックすることを検討してください。

編集:ところで、静的クラスを行うことはお勧めしません。TDD を行っている場合は、すべてをインターフェース化することをお勧めします。

于 2010-07-02T00:51:11.117 に答える
10

何らかの理由で PowerMock が利用できない場合に備えて:

静的呼び出しをメソッドに移動し、テスト クラスのテスト済みクラスのインスタンス化でこのメソッドをオーバーライドし、テスト クラスでローカル インターフェイスを作成し、オーバーライドされたメソッドでそのメソッドを使用できます。

private interface IMocker 
{
    boolean doSomething();
}

IMocker imocker = EasyMock.createMock(IMocker.class);

...

@Override
void doSomething()
{
     imocker.doSomething();
}

...

EasyMock.expect(imocker.doSomething()).andReturn(true);
于 2012-08-30T08:41:00.167 に答える
4

一般的に言えば、何らかのアクセサーを使用せずに静的メソッドをモックすることはできません。これは、静的メソッドを使用する目的を無効にするようです。それはかなりイライラすることがあります。

私が知っている「TypeMock Isolator」と呼ばれるツールが 1 つあります。このツールは、ある種の悪魔の魔法を使用して静的メソッドをモックしますが、そのツールは非常に高価です。

問題は、静的メソッドをオーバーライドする方法がわからないことです。仮想と宣言することはできません。インターフェイスに含めることはできません。

ネガティブネリーでごめんなさい。

于 2010-07-07T16:40:02.373 に答える