使用Spock在Java中存根或模拟静态方法

时间:2019-07-03 13:03:54

标签: java spock

是否可以使用Spock在Java中模拟静态方法?我知道可以模拟静态Groovy方法,但无法在Java方法中使用。

2 个答案:

答案 0 :(得分:2)

首先,对这个问题最好/最糟糕的解决方案之一是Powermock。是的,Powermock将使您能够模拟静态方法。您对方法进行了模拟,您的测试通过了,并且完全处于刚降落在月球上的印象(只是在开玩笑)。我将是第一个承认我对此做法100%有罪的人,由于我缺乏思想,我应该被判为死刑。

使用Powermock模拟静态方法,您实际上完成了什么?

您正在使任何正在使用的应用程序中都可能已经大量存在的反模式永久存在。在此过程的许多负面影响中,有其他开发人员会加入进来,查看此代码,并认为可以在他们正在使用的任何用例中继续实施此解决方案。

我的看法是这样。我从模拟静态方法开始,但是从来没有感觉到正确。在开始编写测试之前,太多的设置和配置。

我发现,通过创建一个可以在被测类中注入一个模拟对象(取决于您的情况)的助手类,该方法将返回静态实例方法的类型,这将允许我模拟该方法,因此避免使用Powermock。同样,在这种用例中的生产代码也不会受到影响。

现在,我现在正在100%使用Spock,但是使用JUnit可以实现相同的原理。

如果发现自己依赖应用程序中的Powermock,请考虑消除这种依赖性。这是实际上为问题提供解决方案的最糟糕的开源库之一,但从未解决并提出解决问题根本原因的解决方案。

答案 1 :(得分:0)

不。为此,您需要PowerMockito。重构类,或者将静态调用包装在受保护的方法中,然后将其作为间谍进行存根。