如何使用 PowerMockito 模拟私有字段?
How do I mock a private field using PowerMockito?
作为副本提出的解决方案不是 PowerMockito 解决方案,因此没有回答这个问题。此外,这个问题在下面得到了合理的回答。
IDK 是否重复,但如果重复,我肯定找不到有问题的项目。我一直期望这会非常简单,因为它使用反射非常简单,但我宁愿使用正确的工具来完成它。
澄清:遗留代码。没有吸气剂/吸气剂。
为此使用 Whitebox 是否正确?我认为它是 "Off Limits" 即内部 API 的一部分? ...或者那是严格意义上的 Mockito?
见Whitebox.setInternalState(...)
。
例如 - 给定 class A
需要测试:
public class A {
private B b;
public A() {
b = new B();
}
public void doSomething() {
b.doSomething();
}
}
它有一个私有实例 B
:
public class B {
public void doSomething() {
// some long running, resource intensive process...
System.out.println("Real B.doSomething() was invoked.");
}
}
然后Whitebox
可以用来设置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();
}
}
作为副本提出的解决方案不是 PowerMockito 解决方案,因此没有回答这个问题。此外,这个问题在下面得到了合理的回答。
IDK 是否重复,但如果重复,我肯定找不到有问题的项目。我一直期望这会非常简单,因为它使用反射非常简单,但我宁愿使用正确的工具来完成它。
澄清:遗留代码。没有吸气剂/吸气剂。
为此使用 Whitebox 是否正确?我认为它是 "Off Limits" 即内部 API 的一部分? ...或者那是严格意义上的 Mockito?
见Whitebox.setInternalState(...)
。
例如 - 给定 class A
需要测试:
public class A {
private B b;
public A() {
b = new B();
}
public void doSomething() {
b.doSomething();
}
}
它有一个私有实例 B
:
public class B {
public void doSomething() {
// some long running, resource intensive process...
System.out.println("Real B.doSomething() was invoked.");
}
}
然后Whitebox
可以用来设置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();
}
}