0

この(正常に動作する)Grailsサービスの単体テストを作成しています:

class CommonCodeService {

    def gridUtilService

    def getList(def params){
        def ret = null

        try {
            def res = gridUtilService.getDomainList(CommonCode, params)
            def rows = []
            def counter = 0
            res?.rows?.each{ // this is line 15
                rows << [
                        id: counter ++,
                        cell:[

                            it.key,  
                            it.value  
                        ]
                ]
            }

            ret = [rows: rows, totalRecords: res.totalRecords, page: params.page, totalPage: res.totalPage]

        } catch (e) {
            e.printStackTrace()
            throw e
        }

        return ret
    }

}

これはコラボレーターからのメソッドですGridUtilService:

import grails.converters.JSON

class GridUtilService {

    def getDomainList(Class domain, def params){
        /* some code */
        return [rows: rows, totalRecords: totalRecords, page: params.page, totalPage: totalPage]
    }
}

そして、これは私の(動作していない)単体テストです:

import grails.test.mixin.TestFor
import grails.test.mixin.Mock
import com.emerio.baseapp.utils.GridUtilService

@TestFor(CommonCodeService)
@Mock([CommonCode,GridUtilService])
class CommonCodeServiceTests {

    void testGetList() {
        def rowList = [new CommonCode(key: 'value', value: 'value')]
        def serviceStub = mockFor(GridUtilService)
        serviceStub.demand.getDomainList {Map p -> [rows: rowList, totalRecords: rowList.size(), page:1, totalPage: 1]}
        service.gridUtilService = serviceStub.createMock()
        service.getList() // this is line 16
    }

}

テストを実行すると、例外が表示されます:

No such property: rows for class: com.emerio.baseapp.CommonCodeServiceTests
groovy.lang.MissingPropertyException: No such property: rows for class: com.emerio.baseapp.CommonCodeServiceTests
    at com.emerio.baseapp.CommonCodeService.getList(CommonCodeService.groovy:15)
    at com.emerio.baseapp.CommonCodeServiceTests.testGetList(CommonCodeServiceTests.groovy:16)

の代わりにモックされた returnGridUtilServiceインスタンスCommonCodeServiceTestsのようですMap。単体テストの何が問題になっていますか?

4

1 に答える 1

1

モックgetDomainList()呼び出しのメソッド パラメータを修正する必要があるようです。あなたはそれを持っていますMap mが、おそらくそうである必要がありますClass c, Map m

ドキュメントから、

クロージャー引数は、モックされたメソッドの数と型と一致する必要がありますが、それ以外の場合は、本体に必要なものを自由に追加できます。

引数の欠落がそのように振る舞う理由は困惑です。私自身の簡素化されたクラスを使用して、問題を再現できます。また、パラメーター ミスがある場合にメソッドの呼び出しに対して返される型は、テスト クラスのクロージャーであることもわかりました。これは、少なくとも私の単純なケースでは.call()、目的の (モックされた) 結果を得るために 'ed' にすることができます。この動作が何らかの機能をサポートしているのか、それともバグなのかはわかりません。確かに紛らわしいです。

于 2012-12-04T18:14:02.820 に答える