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

Col*_*ton 15 java spring static mocking

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

我正在使用Spring 2.5和JUnit 4.4

@Service
public class SomeServiceImpl implements SomeService {

    public Object doSomething() {
        Logger.getLogger(this.class); //a static method invoked.
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我不控制我的服务需要调用的静态方法,所以我不能将它重构为更可单元测试.我使用Log4J Logger作为示例,但真正的静态方法类似. 不能更改静态方法.

做Grails工作,我习惯使用类似的东西:

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

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

Jon*_*eet 14

你是说你无法控制主叫代码吗?因为如果您控制对静态方法的调用而不是实现本身的调用,则可以轻松地使其成为可测试的.使用与静态方法具有相同签名的单个方法创建依赖关系接口.您的生产实现只会调用静态方法,但当前调用静态方法的任何内容都将通过接口调用.

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


Col*_*ton 0

基本上,目前在 Java + Spring 2.5 和 JUnit 4.4 中没有一种简单的方法可以做到这一点。

尽管可以重构并抽象出静态调用,但重构代码并不是我正在寻找的解决方案。

JMockit 看起来可以工作,但与 Spring 2.5 和 JUnit 4.4 不兼容。

  • PowerMock已经被建议并且能够模拟静态方法,所以有一个简单的方法 (2认同)