我正在尝试对 Controller 的日期和参数 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 View 上的标签之一是
并且 TypeToReturn 具有一个属性:
LocalTime propertyName
当应用程序在浏览器中正常运行时,参数映射将正确传递给服务方法,并且新的TypeToReturn(params)创建的实例TypeToReturn 。
参数包含以下内容:
{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'
如果我完全从 map 上省略了 params.put(“propertyName”,“struct”),则再次(正确)错误提示TypeToReturn没有属性propertyName_hour
因此,我应该如何对使用 Controller 中的params Map的服务方法进行单元测试?仅在测试中重新创建 map 似乎不起作用。应该以特殊方式对参数Map进行模拟/插入吗?
谢谢
最佳答案
您是以单元测试还是集成测试的形式运行?如果尚不存在,请尝试将其移至测试/集成并使用
grails test-app integration:
它将在Grails环境中运行测试,并为joda-time插件提供机会,使其可以执行任何元编程魔术,以创建看上去像您所缺少的类型转换为DateTime的功能。
关于unit-testing - Grails-操作方法-使用 Controller 参数的单元测试服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927381/