我正在尝试对一个服务方法进行单元测试,该方法将控制器中的日期和参数 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是否应以某种方式进行模拟/存根?
由于
答案 0 :(得分:0)
您是将测试作为一个单元还是集成测试运行?如果它还没有,请尝试将其移至测试/集成中并使用
从那里运行grails test-app integration:
在Grails环境中运行测试,并为joda-time插件提供机会去做任何元编程魔术,以创建到DateTime的类型转换,看起来你错过了。