我如何在Java(jUnit4)中轻松模拟出静态方法

2022-09-03 06:03:21

如何在Java中轻松模拟静态方法?

我正在使用Spring 2.5和JUnit 4.4

@Service
public class SomeServiceImpl implements SomeService {

    public Object doSomething() {
        Logger.getLogger(this.class); //a static method invoked.
        // ...
    }
}

我不控制我的服务需要调用的静态方法,所以我无法重构它以使其更易于单元测试。我以Log4J Logger为例,但真正的静态方法是相似的。不能选择更改静态方法。

做圣杯工作,我习惯于使用这样的东西:

def mockedControl = mockFor(Logger)
mockControl.demand.static.getLogger{Class clazz-> … }
…
mockControl.verify()

如何在Java中做类似的事情?


答案 1

您的意思是您无法控制调用代码吗?因为如果控制对静态方法的调用,但不控制实现本身,则可以轻松使其可测试。使用与静态方法具有相同签名的单个方法创建依赖项接口。您的生产实现将只调用静态方法,但当前调用静态方法的任何内容都将通过接口进行调用。

然后,您可以以正常方式模拟该接口。


答案 2

JMockit框架承诺允许模拟静态方法。

https://jmockit.dev.java.net/

事实上,它提出了一些相当大胆的主张,包括静态方法是一个完全有效的设计选择,它们的使用不应该因为测试框架的不足而受到限制。

无论这种说法是否合理,JMockit框架本身都非常有趣,尽管我自己还没有尝试过。


推荐