Kontakt
stefan.bente[at]th-koeln.de
+49 2261 8196 6367
Discord Server
Prof. Bente Personal Zoom
Adresse
Steinmüllerallee 4
51643 Gummersbach
Gebäude LC4
Raum 1708 (Wegbeschreibung)
Sprechstunde nach Vereinbarung
Terminanfrage: calendly.com Wenn Sie dieses Tool nicht nutzen wollen, schicken Sie eine Mail und ich weise Ihnen einen Termin zu.

Testen von JSON Serializing bei Domain Primitives

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.

Unser Beispiel für ein Domain Primitive

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;
    // ...
}

Der Test

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 );
    }

Korrektur von Property-Namen in der Klasse

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;
    // ...
}