在进行集成测试时,使domain.save(failOnError:true)失败

时间:2016-07-06 09:15:30

标签: grails integration-testing

我故意导致cat实例失败。以下测试通过。

  void testSomething() {                            

        Cat.metaClass.save = {

            throw new Exception("Asdasd")
        }

        shouldFail(Exception){

            Cat cat = new Cat(name: "asd")
            cat.save()

        }


        GroovySystem.metaClassRegistry.removeMetaClass(Cat.class)


    }

但是,当我为save方法设置failOnError属性时,这会失败。如何使用metaClass更改保存以使保存(failOnError:true)抛出异常?我感谢任何帮助!谢谢!

  void testSomething() {                            

        Cat.metaClass.save = {

            throw new Exception("Asdasd")
        }

        shouldFail(Exception){

            Cat cat = new Cat(name: "asd")
            cat.save(failOnError: true)

        }


        GroovySystem.metaClassRegistry.removeMetaClass(Cat.class)


    }

执行相同测试的一种替代方法是将无效参数传递给域实例,以便验证失败并抛出异常但这在所有情况下都不起作用,因为在某些情况下域实例不需要任何参数由用户给出。因此,为了模拟域save()的失败,在这种情况下,我们需要一种模拟保存失败的方法。所以,我很感激,如果有人回答如何模拟保存,有或没有保存参数如save(flush:true),save(failOnError:true)。谢谢!

1 个答案:

答案 0 :(得分:1)

你的第一个metaClassing save()的实例很好。

在尝试metaClass save(failOnError:true)版本时,您必须更改metaClassing语句以匹配实际使用的方法的签名。 “save()”调用与“save(failOnError:true)”调用不同。试试这个(我怀疑参数是严格输入的,所以我使用Map。:

Cat.metaClass.save = { Map map -> 
    throw new Exception("failOnError is true")
}