我正在为Grails 1.3.5中的服务编写一个Spock Spec(单元测试),我遇到了以下错误:
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()
添加到域类的方法上的差异,而不是在运行时使用真正的域类?如果是这样,他们是什么?
答案 0 :(得分: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()
}
}
(编辑结束)
或者你可以进行集成测试,然后它会运行很长时间。我不推荐。
答案 1 :(得分:1)