Grails 模拟失败
Grails mocking is failing
我编写了一个正在执行集成测试的服务。该服务在内部调用外部休息服务并填充值。
服务class
import org.springframework.web.client.RestTemplate;
class Service {
final static RestTemplate TEMPLATE = new RestTemplate()
def getList() {
final String info = TEMPLATE.getForObject(getHostUrl(), String.class,[:])
return info
}
为了避免实际的外部服务调用,我尝试如下模拟它。
class ServiceIntegrationSpec extends IntegrationSpec {
void testList() {
setup:
List<Employee> list = new ArrayList<>()
list.add(new Employee(id:"123", name: "test1"))
list.add(new Employee(id:"146", name: "test2"))
def clazz = String.class
def url = ""
def emptyMap = [:]
rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
Map emptyMap ->list}
when:
def val = service.getList()
then:
val != null
}
}
当集成测试 运行 使用命令:grails test-app integration:,我得到以下错误:
- 当前范围已经包含一个变量url
- 当前作用域已经包含一个变量clazz
- 当前作用域已经包含变量emptyMap
您尝试重命名元类方法的变量
rackService.TEMPLATE.metaClass.getForObject = {String urlParameter, Class clazzParameter,
Map emptyMap ->listParameter}
不需要预先定义url、clazz和emptyMap。
代码
def clazz = String.class
def url = ""
def emptyMap = [:]
rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
Map emptyMap ->list}
可以替换为
rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
LinkedHashMap emptyMap ->list}
请注意,groovy 默认将此空映射 [:] 视为 LinkedHashMap。请在下面找到参考资料:
http://www.javaworld.com/article/2073116/java-collections-default-implementation-choices--groovy-s-opinion.html
我编写了一个正在执行集成测试的服务。该服务在内部调用外部休息服务并填充值。
服务class
import org.springframework.web.client.RestTemplate;
class Service {
final static RestTemplate TEMPLATE = new RestTemplate()
def getList() {
final String info = TEMPLATE.getForObject(getHostUrl(), String.class,[:])
return info
}
为了避免实际的外部服务调用,我尝试如下模拟它。
class ServiceIntegrationSpec extends IntegrationSpec {
void testList() {
setup:
List<Employee> list = new ArrayList<>()
list.add(new Employee(id:"123", name: "test1"))
list.add(new Employee(id:"146", name: "test2"))
def clazz = String.class
def url = ""
def emptyMap = [:]
rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
Map emptyMap ->list}
when:
def val = service.getList()
then:
val != null
}
}
当集成测试 运行 使用命令:grails test-app integration:,我得到以下错误:
- 当前范围已经包含一个变量url
- 当前作用域已经包含一个变量clazz
- 当前作用域已经包含变量emptyMap
您尝试重命名元类方法的变量
rackService.TEMPLATE.metaClass.getForObject = {String urlParameter, Class clazzParameter,
Map emptyMap ->listParameter}
不需要预先定义url、clazz和emptyMap。 代码
def clazz = String.class
def url = ""
def emptyMap = [:]
rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
Map emptyMap ->list}
可以替换为
rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
LinkedHashMap emptyMap ->list}
请注意,groovy 默认将此空映射 [:] 视为 LinkedHashMap。请在下面找到参考资料:
http://www.javaworld.com/article/2073116/java-collections-default-implementation-choices--groovy-s-opinion.html