假设其他答案指出此类测试用例很脆弱,并且测试用例不应基于实现,并且如果您仍想模拟它们,则应依赖于行为,那么这里有一些方法:
PrivateMethodDemo tested = createPartialMock(PrivateMethodDemo.class,
"sayIt", String.class);
String expected = "Hello altered World";
expectPrivate(tested, "sayIt", "name").andReturn(expected);
replay(tested);
String actual = tested.say("name");
verify(tested);
assertEquals("Expected and actual did not match", expected, actual);
这就是您使用 PowerMock 的方式。
PowerMock 的expectPrivate()就是这样做的。
来自 PowerMock的测试用例,用于测试私有方法模拟
更新:
使用 PowerMock进行部分模拟有一些免责声明和问题
class CustomerService {
public void add(Customer customer) {
if (someCondition) {
subscribeToNewsletter(customer);
}
}
void subscribeToNewsletter(Customer customer) {
// ...subscribing stuff
}
}
然后你创建一个 CustomerService 的 PARTIAL 模拟,给出你想模拟的方法列表。
CustomerService customerService = PowerMock.createPartialMock(CustomerService.class, "subscribeToNewsletter");
customerService.subscribeToNewsletter(anyObject(Customer.class));
replayAll();
customerService.add(createMock(Customer.class));
因此add()
,在 CustomerService 模拟中是您想要测试的真实事物,并且对于subscribeToNewsletter()
您现在可以像往常一样编写期望的方法。