首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在grails测试中比较JSON

如何在grails测试中比较JSON
EN

Stack Overflow用户
提问于 2013-09-20 20:52:59
回答 3查看 3.8K关注 0票数 4

我在Grails中有一个控制器,它用JSON返回响应。

我已经写了一个测试,它的工作原理大致如下

代码语言:javascript
复制
test(){
     def expectedResponse=JSON.parse('[{"username":"user","startDate":"2010-11-30"}]')
    ...
            def actualResponse=JSON.parse(response.text)

            println "Expecting: ${expectedResponse.toString()}"
            println "Actual: ${actualResponse.toString()}"

            assertEquals(expectedResponse.toString(), actualResponse.toString())
    ...
        }

这与预期的一样工作

代码语言:javascript
复制
Expecting: [{"username":"user","startDate":"2010-11-30"}]
Actual: [{"username":"user","startDate":"2010-11-30"}]

但是,我想知道是否有更好的方法来实现这一点,而不是求助于字符串比较。也许可以让我灵活地向响应添加属性,而不会使我的测试用例无效?

我可以自己构建这个,但我希望在语言中内置某种JSON比较。

更新:我试着在没有toString的情况下直接这样做,结果不一致,不太确定为什么,它在一个阶段工作,然后突然得到这个。我看不到我所做的任何可能导致差异的代码更改

代码语言:javascript
复制
groovy.lang.MissingMethodException: No signature of method: com.siggysale.MainControllerTests.assertEquals() is applicable for argument types: (org.codehaus.groovy.grails.web.json.JSONArray, org.codehaus.groovy.grails.web.json.JSONArray) values: [[], []]
EN

回答 3

Stack Overflow用户

发布于 2013-09-21 15:39:20

您可以使用下面的代码使用GJSON库来比较json。

代码语言:javascript
复制
class GJsonUtil {

    static Boolean compareJsonStrings(String obj1, String obj2){
        JsonParser parser = new JsonParser();
        JsonElement o1 = parser.parse(obj1)
        JsonElement o2 = parser.parse(obj2)
        return o1==o2
    }
}

这也是使用几个测试用例进行测试的。正如你所看到的,json中元素的顺序并不重要,即{test1:1,test2:2}应该与{test2:2,test1:1}相同。

代码语言:javascript
复制
class GJsonSpec extends UnitSpec {

    @Unroll("#ID : comparing two json")
    def "Comparing json string"() {

        setup:

        when:
        def json1String = (obj1 as JSON).toString()
        def json2String = (obj2 as JSON).toString()
        println "json1String=${json1String}"
        println "json2String=${json2String}"
        def match=GJsonUtil.compareJsonStrings(json1String,json2String)

        then:
             match==result

        where:

        ID | obj1                    | obj2                    | result
        1  | [a: 1, b: [c: 1, d: 2]] | [b: [c: 1, d: 2], a: 1] | true
        2  | [a: 1, b: [c: 1, d: 3]] | [b: [c: 1, d: 2], a: 1] | false
        3  | [a: 2, b: [c: 1, d: 2]] | [b: [c: 1, d: 2], a: 1] | false
        4  | [a: 1, b: [d: 1, c: 2]] | [b: [d: 1, c: 2], a: 1] | true
        5  | [a: 1, b: [d: [x:"ram",y:"Laxman"], c: 2]] | [b: [d: [x:"ram",y:"Laxman"], c: 2], a: 1] | true//deep json comparision
        6  | [a: 1, b: [d: [x:"Ram",y:"Laxman"], c: 2]] | [b: [d: [x:"ram",y:"laxman"], c: 2], a: 1] | false//deep json comparision+ lower/uppercase
        7  | [a: 1, b: [d: [x:"Ram",y:["test1","test2","test3"]], c: 2]] | [b: [d: [x:"Ram",y:["test1","test3","test2"]], c: 2], a: 1] | false//deep json comparision+ lower/uppercase
        8  | [a: ["test1","test2","test3"]] | [a:["test1","test2","test3"] ] | true//comaparing list order
        9  | [a: ["test1","test2","test3"]] | [a:["test1","test3","test2"] ] | false//comaparing list order should fail
        10|[:]|null|false
        11|null|[:]|false
        12|null|null|true
        13|[a: ["test1",null,"test3"]] | [a:["test1",null,"test3"] ] | true//comaparing nulls in json



    }


}

希望这能有所帮助!谢谢,

Anuj Aneja

票数 5
EN

Stack Overflow用户

发布于 2013-09-21 01:29:16

如何比较JSON值?

代码语言:javascript
复制
import groovy.json.JsonSlurper

def test() {
    def obj = new JsonSlurper().parseText(response.text)

    assert obj[0].username == "user"
    assert obj[0].startDate == "2010-11-30"

    // make sure there isn't any other data
    assert obj.size() == 1
    assert obj[0].size() == 2
}

(您必须使用obj[0]而不是obj,因为您将返回一个包含1个元素的JSON数组)

票数 1
EN

Stack Overflow用户

发布于 2017-07-19 22:25:33

我使用org.skyscreamer.jsonassert.JSONAssert。简单地说:

代码语言:javascript
复制
JSONAssert.assertEquals(expectedJson, json, true)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18917297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档