在grails中进行单元测试时,如何模拟/存根特定的自定义验证器



假设我有一个域a它对属性p有一个自定义验证器

static constraints = {
        P validator: { val, obj ->
            (A.executeQuery("SELECT COUNT(*) FROM A cei WHERE cei.event.id = ?", [val.id])[0] <= 1)
        }       

在单元测试中,我如何模拟域A的p属性,以便我在运行单元测试时不会得到我得到的错误。当运行单元测试时,我得到的错误如下所示。设置代码实例化域A,如下所示。

void setUp(){
inv = new A(P: rg).save(flush: true)

错误
java.lang.UnsupportedOperationException: String-based queries like [executeQuery] are currently not supported in this implementation of GORM. Use criteria instead.

注意:这些是假代码。

对我来说,最好的选择是将验证器的内部代码封装在一个服务中。然后,在单元测试中模拟该服务。

但是抛出的错误是executeQuery不可用,但是criteria可用。因此,请更改代码以使用条件。

P validator: { val, obj ->
   A.withCriteria{
      eq('event', Event.findById(val.id))
      projections{
         count('id')
      }
   }[0] < = 1
}

最新更新