如何使用PowerMockRunner模拟私有或包受保护的类?

时间:2017-07-13 11:53:44

标签: java android unit-testing mockito powermock

我想使用PowerMock重写受保护类中的方法,以便我在Android项目上进行一些测试。我相信这是正确的方法,这样我就可以代理我想要代理呼叫的方法。

我的测试生活在被测代码所在的软件包之外。

鉴于课程:FooBar

package com.foo.bar
Class FooBar extends Object {
private void updateSomething(int Param1, String param2 ){
        //Do some work....
    }
}

我希望有一个模拟的测试用例,以便我可以代理updateSomething方法。

我设想了这样的事情:

package com.example.test
@RunWith(PowerMockRunner.class)
public class TestClass {

    @PrepareForTest({com.foo.bar.FooBar.class}) //<---COMPLAINT IS HERE
    public void test001_doTest() {
    }
}

这里的问题是IDE抱怨FooBar类不公开。

Error:(209, 55) error: FooBar is not public in com.foo.bar; cannot be accessed from outside package.

我认为PowerMock能够免费克服这个问题。 任何建议将不胜感激。

顺便说一句:我意识到我可以在这里使用Reflection。但是,经常调用此方法的情况下,我可以设置测试,然后通过模拟更改我设置的值,从而导致测试错误地(并且间歇性地)失败。在这种情况下,我认为代理类和方法会更好。那应该是Mockito和PowerMock闪耀的地方?

1 个答案:

答案 0 :(得分:0)

您所描述的内容暗示您的单元测试错误。

为了隔离单位与其依赖关系,您可以模拟您依赖的对象

来自那里:鉴于Foo受包保护 - 不可能 你的代码直接引用Foo。因此,您考虑操纵Foo的事实更多地表明您将有问题的设计放在一起。

从这个意义上说:我建议你仔细查看 need 以控制Foo。因为在理智的设计中,您不必担心范围之外的包受保护的类。花时间改进设计;而不是浪费时间来解决破碎设计的效果