【发布时间】:2014-02-14 15:43:33
【问题描述】:
我们有一个类,它使用 Groovy 的 invokeMethod 拦截器来拦截类上的所有静态方法调用。它用于定义从数据库中提取的规则。最近,我们从 1.3.7 升级到 Grails 2.3.4,如果我调用一个已经定义的方法,测试这个类的单元测试现在会失败。如果尚未定义该方法,它可以正常工作。这是我们正在做的一个非常简化的版本。
class TestUtil {
static {
TestUtil.metaClass.'static'.invokeMethod = { String m_name, args ->
def method = TestUtil.metaClass.getMetaMethod(m_name, args)
if(!method) {
//define it
TestUtil.metaClass.'static'."${m_name}" = { argz ->
return argz[0]
}
}
//call it
"${m_name}"(args)
}
}
}
class TestUtilTest extends GrailsUnitTestCase {
void testMethodNotExist() {
def result = TestUtil.testMethod("not exist")
assertEquals result, "not exist"
}
void testExistingMethod() {
def result = TestUtil.testMethod("exist")
assertEquals result, "exist"
}
}
我得到的错误是:| groovy.lang.MissingMethodException:没有方法签名:静态 TestUtil.testMethod() 适用于参数类型:(java.lang.String) 值:[exist]
当在应用程序的上下文中使用时,代码运行良好……只是单元测试出错了,我不太明白为什么。
【问题讨论】:
-
不确定这是否是问题所在,但您不应该打电话给
TestUtil.metaClass.getStaticMetaMethod而不仅仅是getMetaMethod吗?
标签: unit-testing grails groovy