【发布时间】:2011-01-30 23:55:05
【问题描述】:
所以我有一个 grails 域类:
class Message
{
Inbox inbox
Boolean hasBeenLogicallyDeletedByRecipient
...
static belongsTo = [
inbox:Inbox,
...
]
static constraints = {
hasBeenLogicallyDeletedByRecipient(nullable:false)
...
}
}
我想使用如下动态查找器:
def messages = Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(
inbox, false, [order:'desc',sort:'dateCreated'])
在 STS 2.6.0.M1 中针对 grails 1.2.1 运行单元测试用例可以正常工作; 启动 Web 应用程序时,由于 hasBeenLogicallyDeletedByRecipient 中的 By 失败(我猜它在构建查询时混淆了动态查找器解析)。
我可以使用适用于应用程序的标准生成器:
def messages = Message.withCriteria {
and {
eq('inbox', inbox)
eq('hasBeenLogicallyDeletedByRecipient', false)
}
order('dateCreated', 'desc')
}
但是由于withCriteria 没有被模拟,它不会立即在单元测试中起作用,所以我可以在单元测试中添加以下内容:
Message.metaClass.static.withCriteria = { Closure c ->
...
}
标准/单元测试是否模拟了最佳/公认的方法?我对嘲笑这一点并不完全满意,因为它回避了测试标准闭包。
理想情况下,我宁愿使用动态查找器 - 有没有一种简洁的方法可以让它按原样工作? 如果没有办法,我想可以更改字段名称(我不想这样做是有原因的,但这与问题无关)......
更新:
这是我尝试在应用程序中使用 findAllByInboxAndHasBeenLogicallyDeletedByRecipient() 时的堆栈跟踪 - 注意它似乎如何获取最后一个 By 并将它与 findAll 之间的所有其他内容视为一个财产。我在http://grails.org/OperatorNamesInDynamicMethods 上吃草,但它没有提到任何关于 By 被禁止的事情。
org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [byInboxAndHasBeenLogicallyDeleted] for class [class xxx.Message]
at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController:53)
at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController)
at java.lang.Thread.run(Thread.java:662)
【问题讨论】: