Hamcrest matcher closeTo无法按预期工作

3

我正在使用Spock和RestAssured对rest服务进行一些集成测试。 我在使用hamcrest的closeTo匹配器检查双精度值时遇到了问题:

class PlaceITSpec extends Specification {
 def "Create a Place"() {
    given:
        def place = ['name' : 'Depot A',
                    'location': [
                            'latitude': 40d,
                            'longitude': -3d
                    ]]
        def request = given().accept(ContentType.JSON).contentType(ContentType.JSON).body(place)

    when: "POST /places"
        def response = request.with().post("http://localhost:8080/places")

    then: "I get a the created place resource and 201 status code"
        response.then().log().all()
                .statusCode(201)
                .body("name", equalTo(place['name']))
                .body("location.longitude", is(closeTo(place['location']['longitude'], 0.000001d)))
                .body("location.latitude", is(closeTo(place['location']['latitude'], 0.000001d)))
                .body("_links.self", notNullValue())
                .body("_links.place", notNullValue())

  }
}

测试失败,出现以下错误信息:
java.lang.AssertionError: 1 expectation failed.
JSON path location.longitude doesn't match.
Expected: is a numeric value within <1.0E-6> of <-3.0>
  Actual: -3.0

一切似乎都正常。为了排除明显的错误,我使用了一个1的错误值。然而测试失败并显示:

java.lang.AssertionError: 1 expectation failed.
JSON path location.longitude doesn't match.
Expected: is a numeric value within <1.0> of <-3.0>
  Actual: -3.0

我猜我做错了什么。有人遇到过同样的问题吗?

你正在将一个字符串与一个数字进行比较吗? - jonrsharpe
不,我正在比较两个双精度浮点数。或者至少这是我的意图。让我们检查一下。 - Daniel Cerecedo
检查过了!我没有将字符串与数字进行比较。RestAssured会为您进行正确的转换。无论如何,这让我找到了正确的文档。为了使相等性检查起作用,您必须使用浮点数-3f进行比较,而不是使用双精度数-3d - Daniel Cerecedo
1个回答

3

通过RestAssured文档,我终于找到了正确的答案。

必须使用Java“float”原始类型来比较浮点数。

我更新了我的代码:

class PlaceITSpec extends Specification {
def "Create a Place"() {
given:
    def place = ['name' : 'Depot A',
                'location': [
                        'latitude': 40f,
                        'longitude': -3f
                ]]
    def request = given().accept(ContentType.JSON).contentType(ContentType.JSON).body(place)

when: "POST /places"
    def response = request.with().post("http://localhost:8080/places")

then: "I get a the created place resource and 201 status code"
    response.then().log().all()
            .statusCode(201)
            .body("name", equalTo(place['name']))
            .body("location.longitude", equalTo(place['location']['longitude']))
            .body("location.latitude", equalTo(place['location']['latitude']))
            .body("_links.self", notNullValue())
            .body("_links.place", notNullValue())

  }
}

检查纬度和经度值是否现在具有f后缀来表示使用float原始数据类型而不是double原始数据类型。并且将is(closeTo(data,error))更改为equalTo(data)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接