Validation 如何在域类中模拟验证以进行测试?

Validation 如何在域类中模拟验证以进行测试?,validation,unit-testing,grails,Validation,Unit Testing,Grails,我有一个域类,它使用一个非常复杂的自定义验证器;它需要一个单独的合作者。现在我正在为它创建一个控制器,但我想模拟验证部分。我希望能够知道何时发生某个验证错误,以便控制行为 比如说我有, class Person { static constraint = { key validator: { //complex stuff goes here } } } 在我的控制器规范中,我希望能够告诉我何时希望验证通过或失败。我试

我有一个域类,它使用一个非常复杂的自定义验证器;它需要一个单独的合作者。现在我正在为它创建一个控制器,但我想模拟验证部分。我希望能够知道何时发生某个验证错误,以便控制行为

比如说我有,

class Person {

    static constraint = {
        key validator: {
            //complex stuff goes here
        }
    }

}
在我的控制器规范中,我希望能够告诉我何时希望验证通过或失败。我试过做
Person.metaClass.validate={true}
,但似乎不起作用。这就是我的测试代码的样子

void "Test controller when validation passes"() {
    when:
    controller.json = new Person(...)
    controller.doSomething()

    then:
    //test post condition, etc.
}
如果没有效果,我想直接模拟命令对象,比如

void "Test controller when validation passes"() {
    when:
    controller.doSomething(Mock(Person))

    then:
    1 * _.changeState(_)
    //test post condition, etc.
}

但是如果我能让第一个工作,我更喜欢它。

我的项目中有类似的任务。我们的实现包括ErrorsContainer类,该类通过封装一组对象如何交互来表示对象的概念。Mediator通过防止对象彼此显式引用来促进松散耦合,并允许您独立地改变它们的交互

这种方法的另一个优点是可以缓存验证过程的结果。当应用于相同的前提条件、对象和规则时,它可以提高性能

关于

我想知道我希望验证通过还是失败

您只需调用它的
isEmpty()
,并在如下简单代码中使用它:

public class ValidationProcessor {
    private ErrorsContainer errorsContainer;

    //process Validation 

    ........

    //if validation errors are found add them 
    //into the container

    ........

    //allow to manage the Validation process
    public void SetValidationState(boolean isPassState){
        if(isPassState){
           //set it's state to 'pass'
           errorsContainer.setEmpty();
        }else{
          //apply logic when validation errors are found 
        }
    }

    public void UseCurrentValidationState(){
        if(errorsContainer.isEmpty()){
           //apply logic when no validation errors are found
        }else{
          //apply logic when validation errors are found 
        }
    }
}