如何模拟修改私有变量的私有方法



如何模拟修改私有变量的私有方法?

class SomeClass{
    private int one;
    private int second;
    public SomeClass(){}
    public int calculateSomething(){
        complexInitialization();
        return this.one + this.second;
    }
    private void complexInitialization(){
        one = ...
        second = ...
    }
}

您不能,因为您的测试将取决于它正在测试的类的实现细节,因此很脆弱。您可以重构代码,使当前正在测试的类依赖于另一个对象来进行此计算。然后,您可以模拟被测试类的这种依赖关系。或者,将实现细节留给类本身,并充分测试它的可观察行为。

您可能会遇到的问题是,您没有将命令和查询准确地分离到类中。calculateSomething看起来更像一个查询,但complexInitialization更像是一个命令。

假设其他答案指出此类测试用例是脆弱的,并且测试用例不应该基于实现,并且应该依赖于行为,如果您仍然想模拟它们,那么以下是一些方法:

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));

因此,CustomerService mock中的add()是您想要测试的真实内容,对于方法subscribeToNewsletter(),您现在可以像往常一样编写期望值。

Power mock可能会在这里为您提供帮助。但通常情况下,我会使该方法受到保护,并覆盖以前的私有方法来做我想让它做的事情。

相关内容

  • 没有找到相关文章

最新更新