如果声明没有通过 - groovy脚本

时间:2017-01-05 15:26:03

标签: json groovy soapui

我遇到了一个特定条件的问题。我正在显示json中的值,正如您在屏幕截图中看到的那样,它会在日志中显示值2210,但是当条件应为fail时,它会输出条件为true。我不明白为什么会失败,是否有人有想法为什么或我可以尝试修复它以便它会通过?

enter image description here

以下是代码:

import groovy.json.JsonSlurper
def response = messageExchange.response.responseContent
def json =  new JsonSlurper().parseText(response)
def hotelidjson = json.jet2_hotel_id
hotelid = context.expand( '${#TestCase#hotelid}' )


assert hotelidjson != null

if (hotelidjson == "2210")
    log.info "pass"
else
    log.info "fail"


log.info hotelidjson

更新:

响应字符串输出:

INFO:[{jet2Awards=[], awards=[{awardType=Certificate of Excellence, images={small=https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_small-24283-5.jpg, large=https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_2016_en_US_large-24283-5.jpg}, year=2016}], num_reviews=342, rating_image_url=https://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-24283-5.png, jet2_hotel_id=2210, rating=4.5}]

响应的json在这里:

[{
   "rating": "4.5",
   "rating_image_url": "https://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-24283-5.png",
   "num_reviews": 342,
   "jet2_hotel_id": 2210,
   "awards": [   {
      "awardType": "Certificate of Excellence",
      "year": "2016",
      "images":       {
         "small": "https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_small-24283-5.jpg",
         "large": "https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_2016_en_US_large-24283-5.jpg"
      }
   }], 

谢谢

2 个答案:

答案 0 :(得分:0)

您正在测试"2210",但hotelidjson.toString()"[2210]",因此该对象绝对不是字符串"2210"

实际上是什么,更难说。对于程序员尖叫而言,这是一个普遍的问题,而println()表示他们是相同的,但是assertEquals()说他们不是&#34;在他们的IDE。但请考虑将List<String>打包为"Hello"打印为["Hello"],字符串"[\"Hello\"]"也打印为["Hello"]

此外,此类的对象打印为["Hello"]

 class Hello {
       String toString() {
           "[\"Hello\"]"
       }
 }

因此,在假设两个提供相同println()输出的对象实际上相等之前,您需要更加彻底。

最明智的做法是在调试器中运行测试。在断言之前放置一个断点,在那一点检查变量。

一个dumber选项,但如果你还不是一个习惯性的调试器用户,那么设置开销会减少,就是增加一些诊断日志记录。例如,log.info hotelidjson.getClass()

但我完全建议养成使用调试器的习惯。它很快就能在数小时的时间里回报这一努力。

更新,现在您已经显示了JSON。我希望hotelidjson == 2210能够通过。 2210"2210"不相等,因为一个是数字,另一个是字符串。

(我注意到在评论中你发现它是一个列表。我不知道为什么会这样。)

答案 1 :(得分:-1)

由于hotelidjson实际上是一个列表而不是字符串([2210]是列表的字符串表示形式),因此直接将其与字符串进行比较将始终返回false。你可以这样做:

if (hotelidjson == [2210])

if (hotelidjson[0] == 2210)

小心使用def你应该。

PS:感谢苗条的提示;)