Junit PowerMock测试-设置类的静态字段

Junit PowerMock测试-设置类的静态字段,junit,static,mocking,powermock,Junit,Static,Mocking,Powermock,我很难找到设置类的静态字段的方法。基本上是这样的: public class Foo{ // ... private static B b = null; } Whitebox.setInternalState( Foo.class, "b", (B)null ); 其中B是另一个类 在PowerMock中,除了使用setInternalStateFromContext(),还有其他方法可以做到这一点吗?使用上下文类方法设置一个字段似乎有点过分 谢谢。您只需执行以下操作:

我很难找到设置类的静态字段的方法。基本上是这样的:

public class Foo{
    // ...
    private static B b = null;
}
 Whitebox.setInternalState( Foo.class, "b", (B)null );
其中B是另一个类

在PowerMock中,除了使用
setInternalStateFromContext()
,还有其他方法可以做到这一点吗?使用上下文类方法设置一个字段似乎有点过分

谢谢。

您只需执行以下操作:

Whitebox.setInternalState(Foo.class, b);
其中b是要设置的b的实例

Whitebox.setInternalState(Foo.class, b);
只要您设置了非空值,并且只有一个字段的类为
B
,则此项工作。如果您不能依赖这种奢侈,那么必须提供字段名并将
null
转换为您想要设置的类型。在这种情况下,您需要编写如下内容:

public class Foo{
    // ...
    private static B b = null;
}
 Whitebox.setInternalState( Foo.class, "b", (B)null );

您可以使用
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);
            }       }
YourFieldClass新值;
最终设置字段=Whitebox.getAllStaticFields(YourClass.class);
用于(最终字段:字段){
如果(YourFieldClass.class.equals(field.getType()){//或按字段名检查
字段。setAccessible(true);
field.set(YourClass.class,newValue);
}       }
试试这个:

@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));

不适用于原语和原语包装器。

这里我将设置“android.os.Build.VERSION.RELEASE”的值,其中VERSION是类名,RELEASE是最终的静态字符串值

如果基础字段是final,则该方法将抛出 IllegalAccessException除非setAccessible(true)已成功 此字段和此字段是非静态的,NoSuchFieldException需要在使用field.set()方法时添加


现在,String RELEASE的值将返回“Marshmallow”。

是要为“b”设置的值,只是setInternalState()的另一个参数?是的,它是第二个参数。例如,B new=B();setInternalState(Foo.class,b);只要设置一个非空值,这就可以工作。如果只有一个字段的类为b,那么它不应该是
field.set(YourFieldClass.class,newValue)否。你可以查看api:[link](,java.lang.Object)),上面写着obj——应该修改其字段的对象。实际上,我建议的唯一更改是:
field.set(foo,mock(B.class))