2017-10-18 24 views
5

Các yên tâm usage documentation có ví dụ như thế này:Lẫn lộn trên yên tâm so sánh dấu chấm động

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

OK, vì vậy họ đang sử dụng một khớp hamcrest để so sánh với giá trị int 5.

Nhưng họ có một phần nói rằng yên tâm JSON phân tích cú pháp theo mặc định sử dụng float và không double, nên thay vì so với 12.12 tôi nên so sánh với 12.12f:

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

Chờ, vậy làm thế nào đã làm 5 công việc ở trên, là int và không phải là double? Trình phân tích cú pháp JSON có sử dụng các nguyên thủy khác nhau cho các giá trị nguyên và không nguyên không?

Nhưng nó trở nên khó hiểu hơn. Các lập trình viên thông thạo biết rằng bạn không nên so sánh trực tiếp các giá trị dấu phẩy động (vì sự phức tạp của cách các giá trị dấu phẩy động được lưu trữ, v.v ...). Thay vào đó, bạn nên sử dụng Matchers.closeTo(double operand, double error), cung cấp một biên độ lỗi. Đây là cách chính xác để làm điều đó. Nhưng chờ --- ngay cả khi tôi vượt qua trong 12.12f để Matchers.closeTo (toán hạng đôi, lỗi kép), không phải là nó vẫn sẽ chuyển đổi nó thành một double? Điều này sẽ làm việc với REST được bảo đảm?

Trả lời

1

Tôi không chắc chắn 100% tôi đúng ở đây, nhưng bài này đã trở nên quá dài cho một nhận xét ...

Từ đọc các tài liệu cho HamcrestREST Assured nó có vẻ như equalTo chỉ trả về true trong trường hợp Object.equals trả về true:

[equalTo] Tạo một khớp phù hợp khi đối tượng kiểm tra là một cách logic tương ứng với toán hạng theo quy định, được xác định bằng cách gọi phương pháp (java.lang.Object) trên các Object.equals đối tượng được kiểm tra.

Như vậy kể từ khi yên tâm đại diện cho các giá trị dấu chấm động như phao, và Double.equals chỉ có thể trở lại true nếu đối tượng khác là một Double, nó là cần thiết để sử dụng một float và không phải là một double (như đầu vào sẽ được đóng hộp vào một đối tượng).

Ngoài ra, phần phao trong tài liệu yên tâm dường như chỉ ra nó chỉ áp dụng cho các giá trị dấu chấm động:

số điểm nổi phải được so sánh với một Java "phao" nguyên thủy.

Tôi cho rằng điều đó có nghĩa là số nguyên được biểu diễn chính xác dưới dạng Số nguyên. (Các ví dụ khác trong tài liệu cũng dường như đề nghị này)

Nếu bạn chọn sử dụng Matchers.closeTo thay vì equalTo hoặc is (mà bản thân gọi equalTo), sau đó nó không nên quan trọng nếu bạn sử dụng một double hoặc một float.

+0

Câu trả lời của bạn đến gần nhất để thực sự trả lời câu hỏi của tôi, mặc dù một số câu trả lời của bạn không có thẩm quyền. Điểm quan trọng nhất bạn đưa ra là nếu tôi sử dụng 'Matcher.closeTo()' (và đó là những gì chúng ta nên sử dụng anyway) nó có thể không quan trọng những gì mà trình phân tích cú pháp JSON đặt ra. –

0

Bạn có thể so sánh nhiều thứ với equalTo của hamcrest.Quẹt, nó được sử dụng cũng khẳng định trong bài kiểm tra:

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

Có một so sánh với Long và String, và dĩ nhiên, bạn có closeTo để so sánh những thứ như đôi hoặc BigDecimal, hãy xem herethere

Thật vậy, điều ngạc nhiên là bình thường, nhưng bạn cũng có thể chọn so sánh hoặc làm bằng khi thuận tiện

0

Có vẻ như bạn đang trộn hai thứ lại với nhau.

Trình phân tích cú pháp JSON có sử dụng các nguyên thủy khác nhau cho số nguyên và giá trị không nguyên không?

So sánh giá trị được thực hiện bởi đối tượng đối sánh nhất định. Các matcher nhất định không có bất kỳ ảnh hưởng trên Json Parser trong anyway. Không phân biệt giá trị mà bạn đã đưa cho matcher (5 trong ví dụ đầu tiên) và giá trị nào sẽ trả về bởi jsonpath đã cho, Giá trị bằng (org.hamcrest.core.IsEqual) so sánh cả valu bằng cách gọi phương thức Objects.equals(). Trình phân tích cú pháp Json cũng hoạt động với các đối tượng giá trị chứ không phải với các giá trị nguyên thủy.

vậy làm cách nào 5 làm việc ở trên, đó là int và không phải là gấp đôi?

Giả sử JsonPath lotto.lottoId sẽ trở về giá trị int, do đó body("lotto.lottoId", equalTo(5)); sẽ là đúng (giá trị rõ ràng json phải là 5)

12.2' and 12.2f' được coi là cùng một giá trị trong ví dụ của bạn. Suffixing 'f' trong ví dụ của bạn là thừa và không có hiệu lực. Kể từ khi phương thức closeTo(double, double) đã xác định các loại đối số là gấp đôi, các giá trị float được truyền sẽ được thăng cấp thành hai loại ngầm.

Vì bạn biết bạn giá trị json của sẽ được tăng gấp đôi, Vì vậy, bạn có thể biểu hiện sự khẳng định của bạn như:

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

Tùy thuộc vào cấu hình phân tích cú pháp JSON, giá trị không nguyên có thể được đọc như BigDecimal, Nếu đó là trường hợp, bạn có thể sử dụng phương sai của closeTo() làm

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

Hy vọng điều đó sẽ hữu ích.

0

Nếu bạn đọc kỹ Hamcrest sau đó bạn sẽ tìm thấy, nó được ghi rõ "khi đối tượng kiểm tra là một cách logic tương ứng với toán hạng xác định" cho equalTo. Vì vậy, rõ ràng nó không quan trọng nếu nó là "5" hoặc 5! ANd trong Rest-Assured, Được đề cập rằng equalTo và hasItems là các trình so khớp Hamcrest mà bạn nên nhập tĩnh từ org.hamcrest.Matchers. Vì vậy, tôi không nghĩ rằng nên có bất kỳ sự nhầm lẫn.