やりたいことは、1の一部と2のすべての組み合わせです。
クラスのすべての静的メソッドの静的モッキングを有効にするには、PowerMockito.mockStaticを使用する必要があります。つまり、when-thenReturn構文を使用してそれらをスタブ化できるようになります。
しかし、使用しているmockStaticの2引数のオーバーロードは、モックインスタンスで明示的にスタブしていないメソッドを呼び出したときにMockito / PowerMockが実行する必要があるデフォルトの戦略を提供します。
javadocから:
インタラクションへの答えのために指定された戦略でクラスのモックを作成します。これは非常に高度な機能であり、通常、適切なテストを作成するために必要はありません。ただし、レガシーシステムで作業する場合に役立ちます。これはデフォルトの回答であるため、メソッド呼び出しをスタブしない場合にのみ使用されます。
デフォルトの戦略をスタブデフォルトでは、オブジェクト、数、およびboolean型高く評価方法のためだけのリターンはnull、0またはfalseにあります。2引数のオーバーロードを使用することで、「いいえ、いいえ、いいえ、デフォルトではこのAnswerサブクラスを使用して」デフォルト値を取得するための応答メソッドです。これはLongを返すため、互換性のないものを返す静的メソッドがある場合長い間、問題があります。
代わりに、1引数バージョンのmockStaticを使用して静的メソッドのスタブを有効にし、次にwhen-thenReturnを使用して特定のメソッドに対して何を実行するかを指定します。例えば:
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class ClassWithStatics {
public static String getString() {
return "String";
}
public static int getInt() {
return 1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");
System.out.println("String: " + ClassWithStatics.getString());
System.out.println("Int: " + ClassWithStatics.getInt());
}
}
文字列値の静的メソッドは「Hello!」を返すようにスタブされますが、整数値の静的メソッドはデフォルトのスタブを使用して0を返します。