web-dev-qa-db-ja.com

PowerMock、静的メソッドをモックし、他のすべての静的メソッドで実際のメソッドを呼び出します

クラスの静的メソッドのモックを設定しています。これを_@Before_- annotated JUnitセットアップメソッドで行う必要があります。

私の目標は、実際のメソッドを呼び出すようにクラスをセットアップすることですexcept私が明示的にモックするメソッドに対して。

基本的に:

_@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class);

  // mock out certain methods...
  when(StaticUtilClass.someStaticMethod(anyString())).thenReturn(5); 

  // Now have all OTHER methods call the real implementation???  How do I do this?
}
_

私が直面している問題は、StaticUtilClass内でメソッドpublic static int someStaticMethod(String s)RuntimeException値を指定された場合、残念ながらnullをスローすることです。

以下のように、デフォルトの答えとして実際のメソッドを呼び出す明白なルートを単純に進めることはできません。

_@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods

  // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null!
  // Even though I don't actually want to call the method, I just want to setup a mock result
  when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); 
}
_

デフォルトのAnswerを設定して、他のすべての静的メソッドで実際のメソッドを呼び出す必要があります。after私は、モックに興味のあるメソッドの結果をモックします。

これは可能ですか?

34
Tom Tresansky

あなたが探しているのはpartial mockingです。

PowerMockでは、mockStaticPartialメソッドを使用できます。

PowerMockitoでは、スタブを使用できます。スタブは、定義されたメソッドのみをスタブし、他のメソッドは変更しません。

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5);

また、忘れないでください

@PrepareForTest(StaticUtilClass.class)
57
zibi