2017-10-18 4 views
5

usage documentation 피보험자 나머지는 다음과 같은 예를 가지고 피보험자 :혼란은 부동 소수점 비교

get("/lotto").then().body("lotto.lottoId", equalTo(5)); 

확인을, 그래서 그들은 int 값 5 비교하는 Hamcrest의 정규 표현을 사용하고 있습니다.

그러나 그들은 기본적으로 REST 피보험자 JSON 파서 내가 12.12f에 비교해야 float하지 double, 그래서 대신 12.12에 비교의 사용을 알리는 부분이 있습니다

get("/price").then().body("price", is(12.12f)); 

기다립니다, 그래서 어떻게 5 일했다 위의 그림은 int이고 double이 아닌 것은 무엇입니까? JSON 파서가 정수 및 정수가 아닌 값에 대해 다른 프리미티브를 사용합니까?

하지만 혼란스러워집니다. 잘 알고있는 프로그래머는 부동 소수점 값을 직접 비교해서는 안된다는 것을 알고 있습니다 (부동 소수점 값이 저장되는 방식 등의 복잡성 때문에). 대신 오류 범위를 제공하는 Matchers.closeTo(double operand, double error)을 사용해야합니다. 이것이 올바른 방법입니다. 그러나 기다려라. --- 비록 내가 12.12f을 Matchers.closeTo (double 피연산자, double error)에 건네도 여전히 double으로 변환되지 않을까? REST Assured와 함께 작동합니까?

답변

1
Hamcrest의 문서를 읽을 경우

내가 여기 올바른있어 100 % 모르겠지만,이 게시물 댓글에 대한 너무 오래되었다 ...

REST AssuredequalTo 만에 true를 돌려주는 것 같아 그 경우에 해당 Object.equals 결과 :

[EqualTo가]는 검사 대상 피연산자 지정된 논리적으로 동일한 경우에 Object.equals (java.lang.Object) 메서드를 호출하여 결정되는, 일치하는 정규 표현을 작성 검사 대상. 안심 수레로서 부동 소수점 값을 나타내고, 다른 목적은, Double 경우 Double.equalstrue를 리턴 할 수 있기 때문에

따라서, float 아닌을 사용할 필요가있는 double (입력 현황 박스형 취득하므로 객체).

또한, REST 피보험자 문서에서 수레의 섹션은 단지 부동 소수점 값에 적용 나타낼 것으로 보인다 :

부동 소수점 숫자는 원시 자바 "부동"와 비교해야합니다.

나는 정수가 정수로 적절히 표현된다는 것을 의미한다고 가정합니다. 당신이 double 또는 float를 사용하는 경우 다음이 문제가되지해야한다, 당신은 (그 자체가 equalTo를 호출) Matchers.closeTo 대신 equalTo 또는 is를 사용하도록 선택한 경우

(워드 프로세서의 다른 예는이 제안하는 것 같다).

+0

귀하의 답변 중 일부는 정식 답변이 아니지만 귀하의 답변은 실제로 내 질문에 가장 근접하게 나타났습니다. 가장 중요한 점은 Matcher.closeTo()를 사용하면 JSON 구문 분석기가 무엇을 내놓는 지 상관하지 않을 수 있다는 것입니다. –

0

많은 것들을 hamcrest의 equalTo와 비교할 수 있습니다.정합 기, 시험의 주장도 사용되는 : 살펴

assertThat(longValue, equalTo(10L)); 
assertThat(cadena, equalTo("Esta es una cadena")); 

이 길고 문자열에 대한 비교, 그리고 물론, 당신은 두 배 또는 BigDecimal의 같은 ​​일을 비교하는 했거든이 herethere

정말 놀랍지 만, 평소와 비교하거나 같음을 선택할 수도 있습니다.

0

두 가지를 혼합하는 것처럼 보입니다.

JSON 파서가 정수와 정수가 아닌 값에 대해 다른 프리미티브를 사용합니까?

값 비교는 지정된 일치 프로그램 개체에 의해 수행됩니다. 주어진 matcher는 Json Parser에 아무런 영향을주지 않습니다. Matcher (첫 번째 예제에서는 5)에 주어진 값과 주어진 jsonpath에서 반환하는 값과 관계없이 equals matcher (org.hamcrest.core.IsEqual)는 Objects.equals() 메서드를 호출하여 두 값을 비교합니다. 또한 Json 파서는 프리미티브가 아닌 값 개체와 함께 작동합니다.

그래서 위의 5 가지 작업은 int가 아닌 double입니다. int 값을 반환 JsonPath lotto.lottoId 가정

, 따라서 body("lotto.lottoId", equalTo(5)); 사실

12.2' and 12.2f '당신의 예에서와 같은 값으로 처리됩니다 (분명히 JSON 값이 5이되어야합니다)입니다. 귀하의 예에서 'f'접미사는 중복되어 효과가 없습니다. closeTo(double, double) 메서드는 인수 유형을 double로 정의 했으므로 전달 된 float 값은 암시 적으로 double 유형으로 승격됩니다. 그 경우, JSON 파서 구성에 따라

get("/price").then().body("price", closeTo(12.12, 0.01)); 

, 정수가 아닌 값의 BigDecimal로 읽을 수 :

당신은 당신이 당신의 주장과 같이 표현 할 수는 JSON의 값을 두 번 될 것 알고, 그래서 때문에 경우, 당신은

.get("/price").then().body("price", 
      closeTo(BigDecimal.valueOf(12.12), BigDecimal.valueOf(0.01))) 

는 희망이 도움으로 closeTo()의 분산을 사용할 수 있습니다.

0

주의 깊게 당신이 찾을 수 Hamcrest을 읽는다면, 그것은 분명히 적혀있다 "조사 된 객체가 지정된 피연산자 논리적으로 동일 할 때"에 대한 EqualTo가. 그래서 그것이 "5"인지 5인지는 중요하지 않습니다! 그리고 Rest-Assured에서, 그것은 equalTo와 hasItems가 org.hamcrest.Matchers에서 정적으로 가져와야하는 Hamcrest matchers라고 언급되어 있습니다. 그래서 혼란이 있어서는 안된다고 생각합니다.