Ich verwende die Hamcrest CoreMatcher
Klassen als Teil der spring-test
Integrationstests. Meine JSON wie folgt aussieht:Hamcrest Matcher vergleicht doppelten Wert von JSON
{"data":[{"distanceInMiles":4,"id":"f97236ba-f4ef-4...
Und meine Integrationstest wie folgt aussieht:
double miles = 4.0
Activity a = new BasicActivity(miles);
this.activityManager.add(a); // A mock activity manager (in-memory)
...
this.mockMvc.perform(get("/").accept("application/json"))
.andExpect(jsonPath("$.data[0].distanceInMiles", is(miles)))
jedoch die Behauptung fehlschlägt:
java.lang.AssertionError: JSON path "$.data[0].distanceInMiles"
Expected: is <4.0>
but: was <4>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
Ich weiß, dass es einen separaten IsCloseTo
Matcher hier: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/IsCloseTo.html , aber es so verwendend:
.andExpect(jsonPath("$.data[0].distanceInMiles", closeTo(miles, 0)))
Ergebnisse in einem seltsamen Fehler:
java.lang.AssertionError: JSON path "$.data[0].distanceInMiles"
Expected: a numeric value within <0.0> of <4.0>
but: was a java.lang.Integer (<4>)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
Ich hatte gehofft, eine Art von Fehler zu vermeiden, schließen - ich der zurückgegebene Wert wollen genau 4
sein, ist mir egal einfach nicht, wie viele nachlauf Nullen sind enthalten.
Das Problem ist, dass der 'double' Wert das Modellobjekt erstellen verwendet wird, die für die wird dann als Teil geprüft von die JSON-Antwort, also hoffte ich, die gleiche Variable wiederzuverwenden, um es zweimal zu vermeiden. Ich werde meinen Codeblock aktualisieren, um zu demonstrieren. –
Benutzt du übrigens Java 8? – Tunaki
Ja, ich benutze Java 8. –