web-dev-qa-db-ja.com

PowerMockテスト-クラスの静的フィールドを設定します

クラスの静的フィールドを設定する方法を見つけるのに苦労しています。基本的には次のようなものです。

_public class Foo{
    // ...
    private static B b = null;
}
_

bは別のクラスです。

setInternalStateFromContext()以外の方法でPowerMockでこれを行う方法はありますか?コンテキストクラスメソッドを使用することは、1つのフィールドを設定するのに少し過剰に思えます。

ありがとう。

41
Craig Anderson
Whitebox.setInternalState(Foo.class, b);

Bのクラスを持つフィールドが1つしかない場合は、null以外の値andを設定する限り機能します。その贅沢に頼ることができない場合は、フィールド名を指定し、nullを設定するタイプにキャストする必要があります。その場合、次のように記述する必要があります。

 Whitebox.setInternalState( Foo.class, "b", (B)null );
91
cproinger

これを試して:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Foo.class})
public class FooTest {

    @Test
    public void shouldMockPrivateStaticField() throws IllegalAccessException {
        // given
        Foo foo = new Foo();
        Field field = PowerMockito.field(Foo.class, "b");
        field.set(Foo.class, mock(B.class));

プリミティブおよびプリミティブラッパーでは機能しません。

18

あなたは単純に:

Whitebox.setInternalState(Foo.class, b);

bは、設定するBのインスタンスです。

4
Johan

ここでは、「Android.os.Build.VERSION.RELEASE」の値を設定します。VERSIONはクラス名で、RELEASEは最終的な静的文字列値です。

基礎となるフィールドが最終的な場合、このフィールドとこのフィールドに対してsetAccessible(true)が成功しない限り、メソッドはthrowsan IllegalAccessException非静的、NoSuchFieldExceptionを使用するときに追加する必要がありますfield.set()メソッド

@RunWith(PowerMockRunner.class)
@PrepareForTest({Build.VERSION.class})
public class RuntimePermissionUtilsTest {
@Test
public void hasStoragePermissions() throws IllegalAccessException, NoSuchFieldException {
    Field field = Build.VERSION.class.getField("RELEASE");
    field.setAccessible(true);
    field.set(null,"Marshmallow");
 }
}

現在、String[〜#〜] release [〜#〜]の値は「Marshmallow」。

1
anand krish

getAllStaticFieldsを使用して設定しようとすることができます

例:

YourFieldClass newValue;
final Set<Field> fields = Whitebox.getAllStaticFields(YourClass.class);
        for (final Field field : fields) {
            if (YourFieldClass.class.equals(field.getType())) { // or check by field name
                field.setAccessible(true);
                field.set(YourClass.class, newValue);
            }       }
1