我如何模拟静态属性Groovy?

时间:2013-09-11 06:56:20

标签: unit-testing groovy mocking

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

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

类似的东西:

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

我想模拟log属性,以便在我的测试中它应该为null,并且它不应该初始化。

2 个答案:

答案 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

感兴趣的是,为什么不希望初始化日志变量?