gpt4 book ai didi

unit-testing - Grails 2.x中的Grails单元测试失败

转载 作者:行者123 更新时间:2023-12-02 14:43:58 25 4
gpt4 key购买 nike

我们有一个使用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]

当在应用程序上下文中使用时,代码可以正常工作……只是单元测试正在中断,我还不太清楚为什么。

最佳答案

哇,从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"
}
}

关于unit-testing - Grails 2.x中的Grails单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21319256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com