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

标签 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.
        // ...
    }
}

我不控制我的服务需要调用的静态方法,因此我无法将其重构为更易于单元测试。我用过Log4J Logger作为一个例子,但真正的静态方法是相似的。 改变静态方法不是一个选项。

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

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

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

最佳答案

你的意思是你不能控制调用代码?因为如果您控制对静态方法的调用 而不是实现本身,您可以轻松地使其可测试。使用与静态方法具有相同签名的单个方法创建依赖接口(interface)。您的生产实现只会调用静态方法,但当前调用静态方法的任何东西都将通过接口(interface)调用。

然后您可以以正常方式模拟该界面。

关于java - 如何在 Java (jUnit4) 中轻松模拟出静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1203027/

相关文章:

java - Java 中的数组数组

java - 如何在 GLCanvas 上绘图?

java - 调用 headlessfragment 时 Android Studio : Error of java. lang.NullPointerException

java - Spring MVC 在下一页传递 null 值

java - 无法从 Spring-Jersey 中检索安全上下文

php - 在 PHP 中重新初始化静态成员

java - 带有\0 的字符串在 Java 中表现得很奇怪

php - 测试调用静态方法的 PHP 代码

javascript - javascript静态类继承非静态类的表现

java - 如何使用具有多种响应类型的 RestTemplate?