Grails 如何模拟控制器内部的命令对象

Grails 如何模拟控制器内部的命令对象,grails,groovy,junit,controller,jmock,Grails,Groovy,Junit,Controller,Jmock,我有一个控制器类,其中有一个命令对象。我有一个方法find(),它使用这个命令对象,如下所示: class itemController{ //command object class SearchCommand{ String email static constraints={ email blank:false,email:true } def find = {SearchCommand sc -&

我有一个控制器类,其中有一个命令对象。我有一个方法find(),它使用这个命令对象,如下所示:

class itemController{

    //command object
    class SearchCommand{
        String email
        static constraints={
            email blank:false,email:true
        }

def find = {SearchCommand sc ->
    if(!sc.hasErrors()){
     ----- do something---
}

}
现在,我正在编写一个测试用例来测试控制器中的find方法。但是测试用例在测试时失败了

  if(!sc.hasErrors())
因为sc仍然为“空”。我不确定如何在测试用例中处理这个内部类命令对象。 到目前为止,我编写的测试用例是:

class itemControllerTests extends ControllerUnitTestCase {

    void testFind(){
    def model = controller.find()
    assertNotNull(model)
    }
}

如何在测试用例中处理内部类命令对象。我会嘲笑它吗?我尝试过使用mockCommandObject(?),但不确定如何将内部类命令对象传递给该对象?

您可以使用mockCommandObject

类控制器 类控制器测试
在“mockCommandObject SearchCommand”行引发错误。它无法找到SearchCommand。由于SearchCommand位于itemController内部,我应该如何在testCase中访问它?您可以将SearchCommand类放在itemController类之外,放在同一个文件中,但与“external”类类似。这现在是不可能的。控制器工作正常,正在生产中。我无法更改命令对象以使测试用例工作尝试过的mockCommandObject itemController.SearchCommand也…不工作Groovy.lang.MissingMethodException:没有方法签名:testingproject.RioControllerTests.mockCommandObject()适用于参数类型:(java.lang.Class)值:[class testingproject.RioController$UserCommand]
class RioController {
    class UserCommand{
        String email
        static constraints = {
            email blank: false, email: true
        }
    }

    def load={UserCommand cmd -> 
        if(cmd.validate()){
            flash.message = "Ok"
        }
        else{
            flash.message = "Where is the email?"
        }
    }
}
import grails.test.mixin.*
import org.junit.*

@TestFor(RioController)
class RioControllerTests {

    @Test
    void testLoad(){
        mockCommandObject RioController.UserCommand
        controller.load()
        assert flash.message == "Where is the email?"

        params.email = "verynew@email.com"
        controller.load()
        assert flash.message == "Ok"
    }
}