45

クラスの静的メソッドをモックするように設定しています。これは、注釈付きの@BeforeJUnitセットアップメソッドで行う必要があります。

私の目標は、明示的にモックするメソッドを除いて、実際のメソッドを呼び出すようにクラスを設定することです。

基本的に:

@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が指定されている場合にaをスローすることです。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); 
}

モックに関心のあるメソッドの結果をモックした、他のすべての静的メソッドで実際のメソッドを呼び出すようにデフォルトの回答を設定する必要があります。

これは可能ですか?

4

2 に答える 2

67

あなたが探しているものは部分的なモックと呼ばれています。

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

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

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

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

@PrepareForTest(StaticUtilClass.class)
于 2013-02-01T17:27:44.513 に答える
4

パーティーに遅れましたが、部分的なモックを実現し、明示的に指定することで、モックされたオブジェクトのデフォルトの動作をオーバーライドできます。

以下の例はPowerMockito、動作が明示的に定義されていない場合に実際のメソッドを呼び出す方法を示しています。

例えばPowerMockito.mockStatic(MyClass.class, new CallsRealMethods());

于 2020-08-21T11:12:13.210 に答える