REST保证:如何使用JSON中的嵌套属性查找元素并验证其他属性 - java

我的放心经验有限。我们有很多测试,我通常可以在其中找到示例,或者无法通过该测试,但是我在尝试匹配匿名数组中元素的嵌套属性时卡住了,并上下验证属性(表兄弟?) 。

JSON示例:

[  
   {  
      "id":1,
      "type":{  
         "typeId":3,
         "name":"LPM"
      },
      "status":{  
         "id":1,
         "price":1.20,
         "source":172,
         "valid":0
      }
   },
   {  
      "id":2,
      "type":{  
         "typeId":2,
         "name":"ST"
      },
      "status":{  
         "id":10,
         "price":1.20,
         "source":172,
         "valid":0
      }
   }
]

我使用的放心,我想在列表中找到具有type.name等于LPM的元素,然后仅验证该元素的status.pricestatus.sourcestatus.id

当我最初开始验证响应时,数组中只能包含一项,因此我在使用:

response.then()
        .assertThat()
        .body("size", greaterThan(0))
        .body("[0].type.name", equalToIgnoringCase("LPM"))
        .body("[0].status.id", equalTo(statusId))
        .body("[0].status.source", equalTo(sourceId))
        .body("[0].status.price", equalTo(price));

但是,由于数组中可能有多个元素,因此不再保证可以使用,并且不能保证顺序。

我将身体检查修改为:

response.then()
        .assertThat()
        .body("size", greaterThan(0))
        .body("type.name", hasItem("LPM"))
        .body("status.id", hasItem(statusId))
        .body("status.source", hasItem(sourceId))
        .body("status.price", hasItem(price));

这足以使测试通过,但这会带来以下风险,即具有status.id LPM的元素的status.sourcestatus.pricetype.name可能不正确,但是将不会被检测到。与type.name ST的元素匹配。

因此,我希望能够找到LPM为type.name的元素,我可以保证其中只有一个,然后对于status.idstatus.sourcestatus.price,仅检查该元素,即不是ST元素。

我试图修改我的身体匹配器,以找到需要的type.name元素,但由于无法弄清楚如何从头到尾遍历树,因此无法工作检查同一元素中的其他属性:

response.then()
        .assertThat()
        .body("size", greaterThan(0))
        .body("$.findAll (it.type.name = LPM}.status.id ", hasItem(statusId))
        .body("$.findAll (it.type.name = LPM}.status.source", hasItem(sourceId))
        .body("$.findAll (it.type.name = LPM}.status.price", hasItem(price));

即使这行得通,它也会在真正要完成一次的情况下对树进行3次搜索。

我的中级比赛目前已经通过了这项测试,但是我想做到这一点。我知道我可以将元素放入List并从那里进行处理,但是为了与其余示例保持一致,我宁愿不这样做,尽管我目前看不到其他选择。

我已经尝试在文档中找到要执行的操作的示例,放心的多个教程和示例,但是我没有找到,因此总有可能实际上不可行。如果不是的话,我很乐于教育背后的理论。

任何帮助表示赞赏。

参考方案

这是一种实现方法:

...
then().
        root("find {it.type.name == '%s'}.status").
        body("id", withArgs("LPM"), is(1)).
        body("price", withArgs("LPM"), is(1.20f)).
        body("source", withArgs("LPM"), is(172)).
        body("id", withArgs("ST"), is(10));

(显然,您也可以将withArgs提取到变量中,以避免重复)。

find是Groovy查找与谓词({it.type.name == '%s'})匹配的第一个元素的方式,findAll将始终返回列表。

root指示REST确保确保使用在后续期望中使用的“根路径”(请参见docs)。

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

字符串内存分配 - java

哪一个更好System.out.println("hello world"); 要么String s="hello world"; System.out.println(s); 参考方案 对于此简单示例,在内存分配方面没有区别。