如何使用 PowerMockito 模拟私有字段?

use*_*607 0 java junit powermock powermockito

作为副本提出的解决方案不是 PowerMockito 解决方案,因此不能回答这个问题。此外,这个问题在下面得到了合理的回答。

IDK 是否是重复的,但如果是重复的,我肯定找不到相关项目。我一直期待这真的很简单,因为反射很简单,但我宁愿使用正确的工具来做。

说明:遗留代码。没有吸气剂/二传手。

为此使用 Whitebox 是否正确?我认为它是“Off Limits”,即内部 API 的一部分?……还是严格意义上的 Mockito?

And*_*w S 6

Whitebox.setInternalState(...)

例如 - 给定A需要测试的类:

public class A {
    private B b;

    public A() {
        b = new B();
    }

    public void doSomething() {
        b.doSomething();
    }

}
Run Code Online (Sandbox Code Playgroud)

它有一个私有实例B

public class B {

    public void doSomething() {
        // some long running, resource intensive process...
        System.out.println("Real B.doSomething() was invoked.");
    }

}
Run Code Online (Sandbox Code Playgroud)

thenWhitebox可用于设置的私有状态,A以便对其进行测试:

import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.reflect.Whitebox;

@RunWith(MockitoJUnitRunner.class)
public class ATest {

    @Mock
    private B b;

    private A a;

    @Before
    public void prepareTest() {
        doNothing().when(b).doSomething();

        a = new A();
        Whitebox.setInternalState(a, B.class, b);
    }

    @Test
    public void doSomething() {
        a.doSomething();
        verify(b).doSomething();
    }

}
Run Code Online (Sandbox Code Playgroud)