Grails单元测试在Grails 2.x中失败

时间:2014-01-23 21:03:59

标签: unit-testing grails groovy

我们有一个使用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:没有方法签名:static TestUtil.testMethod()适用于参数类型:(java.lang.String)values:[exists]

当在应用程序的上下文中使用时,代码工作正常......它只是单元测试正在破坏,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:1)

哇,从1.3.7到2.3.4 ......是人类的一次巨大飞跃。 :)

由于扩展GrailsUnitTestCase,您收到错误。

如果您没有在util类的测试中进行任何类型的模拟,那么您可以修改测试类以扩展GroovyTestCase而不是GrailsUnitTestCase。它应该工作。

不鼓励

GrailsUnitTestCase在较新版本的Grails中使用。使用Grails 2.3.4,当您从命令行创建测试或创建任何人工制品时,默认情况下会获得spock,如果您使用如下的spock测试,则不应该看到任何问题:

import spock.lang.Specification

class TestUtilSpec extends Specification {

    void "test both in one test case"(){
        expect:
            result == TestUtil.testMethod(arg)

        where:
            arg         || result
            "not exist" || "not exist"
            "exist"     || "exist"
    }
}