3

我正在为 Grails 1.3.5 中的服务编写 Spock 规范(单元测试),但遇到以下错误:

No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]] Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;)

groovy.lang.MissingMethodException: No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]]
Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;)
    at grails.test.MockUtils.addDynamicFinders_closure56(MockUtils.groovy:641)
    at myapp.MyService.getCards(MyService.groovy:8)
    at myapp.MyServiceSpec.getCards returns empty map if no cards or statuses are available(MyServiceSpec.groovy:13)

以前这个测试通过了,但是当我修改我的服务以在getThings()方法中包含结果排序时发生了失败。

class MyService {
    static transactional = true

    static getThings() {
        Thing.findAll(sort: 'index', order: 'asc')
    }
}

当应用程序运行时,这似乎仍然有效,所以我怀疑这是mockDomain().

class MyServiceSpec extends UnitSpec {
    def 'mockDomain has some limits, i suspect'() {
        given:
            mockDomain(Thing)
            def myService = new MyService()
        when:
            myService.getThings()
        then:
            true
    }
}

所以我的问题是它们在添加到域类的方法mockDomain()中使用与在运行时使用真正的域类的区别?如果是这样,它们是什么?

4

2 回答 2

3

sort并且order是 Hibernate 标准参数,它们无法使用MockDomain()- 它不涉及 Hibernate。幸运的是。

您可以自己模拟该findAll()签名,使用实例数组 - MockDomain()编辑)的第二个参数,这会覆盖findAll(Map)签名Thing

List<Thing> thingInstances = []

void setUp() {
    mockDomain(Thing, thingInstances)

    Thing.metaClass.`static`.findAll = { Map m ->
        def result = thingInstances.sort{ it."${m.order}" }
        m.order == 'asc' ? result : result.reverse()
    }
}

编辑结束)

或者您可以对其进行集成测试,然后它将运行很长时间。我不推荐。

于 2010-12-15T14:22:24.370 回答
1

有一种模拟域对象的新方法:http: //grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html。也许这可以帮助你。

于 2010-12-15T15:03:30.073 回答