如何修改私有变量的模拟私有方法?
class SomeClass{
private int one;
private int second;
public SomeClass(){}
public int calculateSomething(){
complexInitialization();
return this.one + this.second;
}
private void complexInitialization(){
one = ...
second = ...
}
}
答案 0 :(得分:8)
你没有,因为你的测试将依赖于它正在测试的类的实现细节,因此会很脆弱。您可以重构代码,使您当前正在测试的类依赖于另一个对象来进行此计算。然后你可以模拟被测试类的这种依赖性。或者将实现细节留给类本身并充分测试它的可观察行为。
您可能遇到的问题是您并没有完全将命令和查询分离到您的班级。 calculateSomething
看起来更像是一个查询,但complexInitialization
更像是一个命令。
答案 1 :(得分:2)
如果其他答案指出这样的测试用例是脆弱的,并且测试用例不应该基于实现,并且如果你仍然想要模仿它们应该依赖于行为,那么这里有一些方法:< / p>
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()就是这样做的。
Test cases from PowerMock测试私有方法模拟
<强>更新强> Partial Mocking with 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));
因此,CustomerService模拟中的add()
是您要测试的真实内容,对于方法subscribeToNewsletter()
,您现在可以像往常一样编写期望。
答案 2 :(得分:1)
Power mock可能会帮到你。但一般来说,我会使方法受到保护,并覆盖以前的私有方法来做我想做的事情。