【发布时间】:2015-07-15 18:45:18
【问题描述】:
我正在使用 Powermock 对一个类进行单元测试。
该类有一个对象列表队列作为私有成员。
我正在使用 PowerMock createPartialMock 部分模拟其中两个方法(比如 A 和 B),然后显式调用方法 C 然后进行验证。
Class Sample {
Queue<List> q;
public C() {
A();
B();
q.add(List);
}
private A() {}
private B() {}
}
Class Test {
void testSomeMethod() {
Sample mock = PowerMock.createPartialMock(Sample.class, "A", "B");
PowerMock.expectPrivate(Sample.class, A).thenReturn("true");
PowerMock.expectPrivate(Sample.class, B).thenReturn("true");
mock.C();
PowerMock.verify(mock);
}
}
现在,当我运行测试时,PowerMock 在q.add(List); 行抛出异常。
谁能指出我犯了什么错误? 我是否也期望 q.add() 方法调用?
【问题讨论】:
-
q未初始化,因此引发 NPE。您可以通过以下方式注入内部状态:Whitebox.setInternalState(mock, "q", new LinkedList<List>());此外,q.add(List);似乎不是有效的 Java,因为List不是有效的实例。除此之外,PowerMock 有一个关于如何mock constructors -
@RomanVottner 为什么不这样做
Whitebox.setInternalState(mock, "q", new PriorityQueue<>());它会添加任何属于“java.util.List”子类型的列表 -
@Vihar 我只是举了一个简单的例子,说明如何将对象注入到类的字段中以进行测试,只要要注入的对象是
Queue<List>的实现。LinkedList只是您可以分配的许多事情之一。如果你更喜欢PriorityQueue<>,那就用它来代替链表
标签: java unit-testing powermock easymock