Power Mock单元测试局部范围的静态方法

时间:2016-11-24 03:12:49

标签: java unit-testing static-methods powermock powermockito

有没有一种好方法可以使用power mockito来模拟下面代码中显示的静态方法?

@Singleton
public class AnimalWorks {

    public void verifyAnimal(Protocol proto, Set<Animal> successAnimals, Set<AnimalRule> rules, String zookeeper,OtherParams additionalParams) throws AnimalException, DAOException {
        ...

        // Static method call to fromAnimalId(arg1,arg2) below:
        // How to mock this method call with PowerMockito so I can have a custom aniSet?

        Set<Animal> aniSet = AnimalGenerator.fromAnimalId(dbtool, additionalParams); 

        ...

    }

} 

1 个答案:

答案 0 :(得分:2)

例如,here解释了使用PowerMock模拟静态方法。

但请记住:在谈论自己的生产代码时,这只是第二个最佳解决方案!因为:静态调用实际上是设计问题。

是的,静态方法很方便,但它们也会导致代码的直接/紧密耦合。当然,他们使用EasyMock或Mockito打破普通的单元测试...

所以,另一个答案是:不要使用PowerMock。而是退后一步,从代码中删除 static 依赖关系。例如,通过创建表示所需功能的接口;然后使用依赖注入来获取实现该接口的一些对象,而不是在代码中进行静态调用。

突然之间,你不再需要PowerMock了。

最后的警告:许多人使用PowerMock没有太多问题。但是当你做一些研究时,你也会发现很多人都有与PowerMock有各种奇怪的问题。所以,不要只选择那个工具,因为它看起来更方便。了解改进您的设计完全杀死使用该工具的需求!

编辑:

重点是:你应该从不做事情,因为有人说&#34;做到这一点&#34;。理想情况下,您了解不同方法的优缺点,然后决定转向哪种方式;取决于该分析。当然,从第一天起,Java就可以使用 static ;因此有很多人为它展示了很好的用例。

但这并没有改变我提到的缺点(直接,紧密耦合)。事情是:我完全停止使用静态 - 以防止单元测试的方式。我从不后悔。

你知道,有些人声称静态阻止你创建可测试的代码 - 比如here(每分钟看这些视频都值得! )。这并不像我提出这个想法。