簡體   English   中英

Grails 2.x中的Grails單元測試失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM