クラスの静的フィールドを設定する方法を見つけるのに苦労しています。基本的には次のようなものです。
_public class Foo{
// ...
private static B b = null;
}
_
bは別のクラスです。
setInternalStateFromContext()
以外の方法でPowerMockでこれを行う方法はありますか?コンテキストクラスメソッドを使用することは、1つのフィールドを設定するのに少し過剰に思えます。
ありがとう。
Whitebox.setInternalState(Foo.class, b);
B
のクラスを持つフィールドが1つしかない場合は、null以外の値andを設定する限り機能します。その贅沢に頼ることができない場合は、フィールド名を指定し、null
を設定するタイプにキャストする必要があります。その場合、次のように記述する必要があります。
Whitebox.setInternalState( Foo.class, "b", (B)null );
これを試して:
@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));
プリミティブおよびプリミティブラッパーでは機能しません。
あなたは単純に:
Whitebox.setInternalState(Foo.class, b);
bは、設定するBのインスタンスです。
ここでは、「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」。
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);
} }