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