在groovy中嘲弄内心阶级

时间:2012-08-27 13:32:42

标签: java grails groovy junit controller

  

可能重复:
  How to Mock Command Object that is inside Controller

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

class RexController{

    //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仍然是'null'。我不知道如何在测试用例中处理这个内部类命令对象。 我到目前为止写的测试用例是:

class itemControllerTests extends ControllerUnitTestCase {

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

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

我应该在测试用例中更改控制器的任何元类属性,以便它识别内部类。

1 个答案:

答案 0 :(得分:0)

您可以在测试中创建/模拟并将Command实例传递给控制器​​调用。

void testFind() {
    def command = new RexController.SearchCommand(email: 'me@here.there')
    // or [email: 'me@here.there'] as RexController.SearchCommand
    def model = controller.find(command)
    assertNotNull(model)
}

mockCommandObject no longer exists“不再需要mockCommandObject()方法,因为Grails会自动检测操作是否需要命令对象。”

但是你最好把所有非UI相关的逻辑移到其他地方 - 到域类或服务,然后测试那个类。