Als Basistest vor der Implementierung von REST Controllern ist es sinnvoll, die korrekte Serialisierung und Deserialisierung von Domain Primitives zu testen. Wenn diese Basistypen nicht korrekt geschrieben oder gelesen werden, bekommt man u.U. schwer zu findende Fehler.
Wenn DPs nicht-öffentliche Setter/Getter haben, oder noch Interfaces implementieren, dann ist das (De-)Serialisierungsverhalten oft anders als erwartet. Das sollte man daher vorab einmal abtesten, weil die Tests für die REST-Endpunkte auf der korrekten Verarbeitung von Request und Response Bodies beruhen. Und diese wiederum enthalten zu JSON-Strings serialisierte Data Transfer Objects (DTOs), möglicherweise mit Domain Primitives darin.
Nehmen wir folgendes Domain Primitive als Beispiel (vereinfacht, nicht Pseudocode,
aber mit “Weglassen”). Es beschreibt ein Gewicht mit Zahlenwert (number
) und
Einheit (unit
, hier der Einfachheit halber als String):
@Embeddable
@AllArgsConstructor
@Getter
public class Weight {
private Float number;
private String unit;
// ...
}
Nehmen wir an, wir erwarten das DP Weight
in folgender Form als JSON serialisiert
(hier eingebettet in ein DTO als Property mit Name “bodyWeight”):
..., "bodyWeight":{"weightNumber":65.6,"unit":"kg"}, ...
Dann kann man in folgender Form einen Test dazu schreiben:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;
//...
@Test
public void shouldSerializeZipCodeStringCorrectly() throws Exception {
// given
Weight weight = new Weight( 65.6f, "kg" );
ObjectMapper mapper = new ObjectMapper();
// when
String json = mapper.writeValueAsString( weight );
// then (assert using JsonPath)
Double weightNumber = JsonPath.read( json, "$.weightNumber" );
String unit = JsonPath.read( json, "$.unit" );
assertEquals( 65.6f, weightNumber, 0.001f, "weightNumber mismatch with delta 0.001f" );
assertEquals( "kg", unit );
}
Der obige Test wird fehlschlagen, weil in der Serialisierung weightNumber
als
Property erwartet wird, in der DP-Klasse das entsprechende Property aber
number
heißt. Wenn man den Property-Namen nicht ändern will, kann man
es auch mit @JsonProperty
annotieren:
//...
public class Weight {
@JsonProperty( "weightNumber" )
private Float number;
private String unit;
// ...
}