Grails - 如何 - 单元测试使用来自控制器的参数的服务

时间:2010-10-13 19:44:15

标签: unit-testing groovy grails

我正在尝试对一个服务方法进行单元测试,该方法将控制器中的日期和参数 LinkedHashMap作为参数。设置如下:

def save = {CustomCommandObject erc ->
...
    if (erc.conditionProperty != null) {
        def result = myService.ServiceMethod(someDate, params)
    ...
    }
    ....
    redirect(controller: 'controllerName', action: 'actionName', id: params.id)
}

class MyService {
    static transactional = false
    ....
    def TypeToReturn ServiceMethod(Date someDate, def params){
    ...
        TypeToReturn typeToReturn = new TypeToReturn(params)
        return typeToReturn
    }
    ....
}

GSP视图中的一个标签属于<类型joda:timerPicker>

TypeToReturn 有一个属性:

LocalTime propertyName

当应用程序在浏览器中正常运行时,params地图会正确传递给服务方法,而 new TypeToReturn(params)会创建一个 TypeToReturn <的实例/ strong>即可。 params包含以下内容:

{java.util.LinkedHashMap$Entry@xxxxx} propertyName_hour -> 20
{java.util.LinkedHashMap$Entry@xxxxx} propertyName_minute -> 30
{java.util.LinkedHashMap$Entry@xxxxx} propertyName -> struct

因此,在我对服务方法的测试中,我有以下内容:

void testSomething() {
    LinkedHashMap<String, String> params = new LinkedHashMap<String, String>();
    params.put("propertyName","struct")
    params.put("propertyName_hour", "20")
    params.put("propertyName_minutes", "30")
    myService = new MyService()
    Date d = new Date()
    myService.ServiceMethod(d,params)
}

然而当我尝试运行测试时出现以下错误:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object 'struct' with class 'java.lang.String' to class
'org.joda.time.LocalTime'

如果我完全从地图中省略 params.put(“propertyName”,“struct”),那么再次(正确)错误说明TypeToReturn没有属性propertyName_hour

因此,我应该如何对从控制器使用params Map的服务方法进行单元测试?简单地在测试中重新创建地图似乎不起作用。 params Map是否应以某种方式进行模拟/存根?

由于

1 个答案:

答案 0 :(得分:0)

您是将测试作为一个单元还是集成测试运行?如果它还没有,请尝试将其移至测试/集成中并使用

从那里运行
grails test-app integration:

在Grails环境中运行测试,并为joda-time插件提供机会去做任何元编程魔术,以创建到DateTime的类型转换,看起来你错过了。