Java 局部范围静态方法的功率模拟单元测试

Java 局部范围静态方法的功率模拟单元测试,java,unit-testing,static-methods,powermock,powermockito,Java,Unit Testing,Static Methods,Powermock,Powermockito,有没有一种好方法可以使用powermockito来模拟代码中下面所示的静态方法 @Singleton public class AnimalWorks { public void verifyAnimal(Protocol proto, Set<Animal> successAnimals, Set<AnimalRule> rules, String zookeeper,OtherParams additionalParams) throws AnimalExc

有没有一种好方法可以使用powermockito来模拟代码中下面所示的静态方法

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

        ...

    }

} 
@Singleton
公共级动物作品{
public void verifyAnimal(协议协议协议、Set-successAnimals、Set-rules、字符串zookeeper、OtherParams additionalParams)抛出AnimalException、DAOException{
...
//对以下fromAnimalId(arg1,arg2)的静态方法调用:
//如何用PowerMockito模拟这个方法调用,这样我就可以有一个自定义的aniSet?
设置aniSet=AnimalGenerator.fromAnimalId(dbtool,附加参数);
...
}
} 

举例说明了使用PowerMock模拟静态方法

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

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

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

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

最后一句警告:许多人使用PowerMock没有太多问题。但是当你做一些研究时,你也会发现很多人在PowerMock上有各种各样的奇怪问题。所以,不要仅仅因为它看起来更方便就选择这个工具。要明白,完全改进您的设计会扼杀使用该工具的必要性

编辑:

关键是:你应该永远不要因为有人说“让它成为现实”而做事情。理想情况下,你们要了解不同方法的利弊,然后决定转向哪条路;根据这一分析。当然,static从第一天起就在Java中可用;因此,有许多人展示了它的良好用例

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


你看,有人声称static阻止你创建可测试的代码(每分钟都值得看这些视频!)。这并不是我提出的想法。

问题是,它被建模为一个静态工厂方法,如有效java中所述。同意。为这个不可实例化的类选择静态方法是一个设计时决策,现在很难改变。回到这个问题上来——我看了dzone的文章,虽然它涉及到解决这个难题的很多方面,但我仍然很难让它在上面的例子中发挥作用,如果能为上面的问题提供一个测试代码片段,那将非常有帮助。