[英]Grails unit test failing in Grails 2.x
我們有一個使用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
,則可以修改測試類以擴展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"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.