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

Cra*_*son 41 junit static mocking powermock

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

public class Foo{
    // ...
    private static B b = null;
}
Run Code Online (Sandbox Code Playgroud)

其中B是另一个类.

有什么方法可以在PowerMock中执行此操作而不是使用setInternalStateFromContext()?使用上下文类方法对于设置一个字段似乎有点过分.

谢谢.

cpr*_*ger 94

Whitebox.setInternalState(Foo.class, b);
Run Code Online (Sandbox Code Playgroud)

只要你设置一个非null值,并且如果只有一个字段的类为B.如果您不能依赖奢侈品,则必须提供字段名称并将其null转换为您要设置的类型.在这种情况下,你需要写这样的东西:

 Whitebox.setInternalState( Foo.class, "b", (B)null );
Run Code Online (Sandbox Code Playgroud)


Mar*_*iuk 18

试试这个:

@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));
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*han 5

你只需这样做:

Whitebox.setInternalState(Foo.class, b);
Run Code Online (Sandbox Code Playgroud)

其中 b 是您要设置的 B 的实例。

  • 只要您设置了一个非空值,这就会起作用。如果只有一个字段为 b 类。 (3认同)