我看到了很多如何在类中模拟静态方法的示例。
我想模拟该类的静态属性,该属性在其定义中进行了初始化。
就像是:
class MyClass {
private static log = LogFactory.getLog(this)
}
我想模拟日志属性,以便在我的测试中它应该为空,并且它不应该自行初始化。
我看到了很多如何在类中模拟静态方法的示例。
我想模拟该类的静态属性,该属性在其定义中进行了初始化。
就像是:
class MyClass {
private static log = LogFactory.getLog(this)
}
我想模拟日志属性,以便在我的测试中它应该为空,并且它不应该自行初始化。
制作静态getter方法:
static def getLog() {
return log
}
使用metaClass.static
模拟方法:
Myclass.metaClass.static.getLog = {
return "what you need"
}
您将“日志”称为属性,但实际上并非如此。假设 MyClass 是一个 Groovy 类,那么声明一个属性时不带 private 或 public 修饰符,如下所示:
class MyClass {
static log = LogFactory.getLog(this)
}
您拥有的是带有初始化程序的私有静态变量。在这种情况下,不会生成任何属性访问方法,并且变量不被视为属性。
因为它是一个带有初始化程序的私有变量,并且您声明您不想更改类,所以您不能停止初始化程序的运行。所以这里最好的办法是模拟出 getLog() 调用以返回 null。一个简单但粗略的方法是:
LogFactory.metaClass.static.getLog = {
return null
}
但这会杀死整个应用程序中的所有日志查找。这对于简单的单元测试来说可能没问题,但更具体的解决方案是使用 Groovy 模拟(MockFor 和 StubFor),这将允许您在特定代码块中模拟 getLog 调用。你可以在这里找到更多
作为一个有趣的问题,你为什么不希望 log 变量初始化?