I have a Grails service that sends out e-mails using a 3rd-party service by doing a HTTP call:

class EmailService {
    def sendEmail(values) {
        def valueJson = values as JSON
        ... // does HTTP call to 3rd party service
    }
}

我已经编写了一个单元测试来测试该服务(因为集成测试会启动Hibernate和整个域框架,这是我不需要的):

@TestFor(EmailService)
class EmailServiceTests {
    void testEmailServiceWorks() {
        def values = [test: 'test', test2: 'test2']
        service.sendEmail(values)
    }
}

但是,当我执行此单元测试时,它在try 执行as JSON转换时失败,并出现以下异常:

UnhandledException:类的org.codehaus.groovy.grails.web.converters.exceptions.ConverterException:不可转换对象:java.util.LinkedHashMap

I then re-wrote my unit test to just do the following:

void testEmailServiceWorks() {
    def value = [test: 'test', test2: 'test2']
    def valueJson = value as JSON
}

当它try 进行as JSON次转换时,我得到了同样的异常.

有谁知道我为什么会得到这个例外,以及我怎样才能修复它?

推荐答案

as JSON魔法是在域框架启动时创建的.

You have to either change your test to an integration one or mock the asType.

def setUp(){
    java.util.LinkedHashMap.metaClass.asType = { Class c ->
        new grails.converters."$c"(delegate)
    }
}

Rember to clean up after yourself in the tearDown, you wouldn't want metaprogramming leaks in your test suite.

def tearDown(){
    java.util.LinkedHashMap.metaClass.asType = null
}

编辑:

Json相关问答推荐

Elasticsearch Go客户端错误:无效的SON格式:在中间件中索引文档时出错

无法根据vega规范中的条件设置文本 colored颜色

PostgreSQL 12.17从JSON数组提取元素

替换字符串中特殊字符的Jolt变换

如何在Vega中使标记的符号在鼠标指针悬停时可点击

Postgres Select json数组并重新映射属性名称

无法使用Jolt变换在嵌套的JSON中提取值

如何从一个700MB的json文件中列出PowerShell中的所有密钥?

规范化JSON数据

在 SQL 存储过程中使用参数 Select 值

打印与 JSON 和 PowerShell 中的模式匹配的子项的父项名称

无法使用 vue.js 访问 JSON 数组的项目

如何使用 Google 表格应用程序脚本将 JSON 中的多个字段提取到 Google 表格中

无法在Kotlin 中解析JSONObject

使用 jq 获取特定键的所有父键

TSQL FOR JSON 嵌套值

如何使用 Serde 使用顶级数组反序列化 JSON?

如何使用 C# 将 JSON 文本转换为对象

JSON 到 JSON 转换器

在 Qt 4.7 中解析 JSON 的最简单方法