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

时间:2016-10-02 08:01:58

标签: unit-testing grails mocking

假设我有一个域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.

注意:这些是假代码。

1 个答案:

答案 0 :(得分:2)

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

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

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