2

我看到了很多如何在类中模拟静态方法的示例。

我想模拟该类的静态属性,该属性在其定义中进行了初始化。

就像是:

class MyClass {
   private static log = LogFactory.getLog(this)
}

我想模拟日志属性,以便在我的测试中它应该为空,并且它不应该自行初始化。

4

2 回答 2

1

制作静态getter方法:

static def getLog() {
    return log
}

使用metaClass.static模拟方法:

Myclass.metaClass.static.getLog = {
   return "what you need"
}
于 2013-09-11T08:20:08.797 回答
0

您将“日志”称为属性,但实际上并非如此。假设 MyClass 是一个 Groovy 类,那么声明一个属性时不带 private 或 public 修饰符,如下所示:

class MyClass {
    static log = LogFactory.getLog(this)
}

您拥有的是带有初始化程序的私有静态变量。在这种情况下,不会生成任何属性访问方法,并且变量不被视为属性。

因为它是一个带有初始化程序的私有变量,并且您声明您不想更改类,所以您不能停止初始化程序的运行。所以这里最好的办法是模拟出 getLog() 调用以返回 null。一个简单但粗略的方法是:

LogFactory.metaClass.static.getLog = {
    return null
}

但这会杀死整个应用程序中的所有日志查找。这对于简单的单元测试来说可能没问题,但更具体的解决方案是使用 Groovy 模拟(MockFor 和 StubFor),这将允许您在特定代码块中模拟 getLog 调用。你可以在这里找到更多

作为一个有趣的问题,你为什么不希望 log 变量初始化?

于 2013-09-17T22:35:24.213 回答