Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Grails2.x中的Grails单元测试失败_Unit Testing_Grails_Groovy - Fatal编程技术网

Unit testing Grails2.x中的Grails单元测试失败

Unit testing Grails2.x中的Grails单元测试失败,unit-testing,grails,groovy,Unit Testing,Grails,Groovy,我们有一个类,它使用Groovy的invokeMethod拦截器截获类上的所有静态方法调用。它用于定义从数据库中提取的规则。最近,我们从1.3.7升级到Grails2.3.4,如果调用一个已经定义的方法,那么测试这个类的单元测试现在就失败了。如果尚未定义该方法,则可以正常工作。这是我们正在做的一个非常简化的版本 class TestUtil { static { TestUtil.metaClass.'static'.invokeMethod = { String m_name, ar

我们有一个类,它使用Groovy的invokeMethod拦截器截获类上的所有静态方法调用。它用于定义从数据库中提取的规则。最近,我们从1.3.7升级到Grails2.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)值:[exist]


当在应用程序的上下文中使用时,代码运行良好…只是单元测试出现问题,我不太明白原因。

Wow,从1.3.7到2.3.4。。。。。人类的巨大飞跃

由于扩展了
GrailsUnitTestCase
,因此出现错误

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

不鼓励在较新版本的Grails中使用
GrailsUnitTestCase
。在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"
    }
}

Grails2.3.4测试默认使用JUnit。仅当您扩展
规范
时,他们才会使用Spock,就像在您的示例中一样Grails 2.3.4创建Spock
规范
特别是当您使用创建单元测试/创建集成测试或任何其他人工制品“创建”测试时,我的意思是:)@你说得对,的确如此。我不知道,因为我从不使用那些命令。尽管如此,我怀疑OP是否想将他的测试从JUnit迁移到Spock来解决这个问题,但我同意他应该停止扩展
GrailsUnitTestCase
我没有尝试扩展GrailsUnitTestCase,但我仍然遇到同样的问题。运行测试时,环境一定发生了一些问题,因为当我运行应用程序本身并使用相同的代码时,它肯定工作正常。@user1895955 Dis您是否继承GroovyTestCase?不确定这是否是问题所在,但您是否应该调用
TestUtil.metaClass.getStaticMetaMethod
,而不是只调用
getMetaMethod