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
你是说你无法控制主叫代码吗?因为如果您控制对静态方法的调用而不是实现本身的调用,则可以轻松地使其成为可测试的.使用与静态方法具有相同签名的单个方法创建依赖关系接口.您的生产实现只会调用静态方法,但当前调用静态方法的任何内容都将通过接口调用.
然后,您可以以正常方式模拟该接口.
基本上,目前在 Java + Spring 2.5 和 JUnit 4.4 中没有一种简单的方法可以做到这一点。
尽管可以重构并抽象出静态调用,但重构代码并不是我正在寻找的解决方案。
JMockit 看起来可以工作,但与 Spring 2.5 和 JUnit 4.4 不兼容。