{"id":524,"date":"2024-10-19T10:03:22","date_gmt":"2024-10-19T09:03:22","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=524"},"modified":"2024-12-23T10:07:08","modified_gmt":"2024-12-23T09:07:08","slug":"json-unit-test-assertions-mit-jsonunit-ein-leitfaden","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=524","title":{"rendered":"JSON-Unit-Test-Assertions mit JsonUnit: Ein Leitfaden"},"content":{"rendered":"\n<p>In modernen Softwareprojekten ist JSON ein zentraler Bestandteil f\u00fcr die Kommunikation zwischen verschiedenen Systemen. Insbesondere bei der Entwicklung von APIs spielt JSON eine Schl\u00fcsselrolle, da es oft als Datenaustauschformat verwendet wird. Um die Integrit\u00e4t und Qualit\u00e4t der APIs sicherzustellen, ist das Testen von JSON-Inhalten unverzichtbar. Hier kommt JsonUnit ins Spiel, eine Java-Bibliothek, die speziell f\u00fcr die Verifizierung von JSON-Inhalten in Unit-Tests entwickelt wurde.<\/p>\n\n\n\n<p>JsonUnit bietet eine elegante und effiziente M\u00f6glichkeit, JSON-Datenstrukturen zu vergleichen und sicherzustellen, dass sie den erwarteten Werten entsprechen. In diesem Artikel werden wir die grundlegenden Konzepte, die Einrichtung und die Anwendung von JsonUnit detailliert besprechen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Warum JsonUnit verwenden?<\/h3>\n\n\n\n<p>Beim Testen von JSON-Strukturen gibt es verschiedene Herausforderungen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Flexibilit\u00e4t beim Vergleich<\/strong>: JSON-Daten k\u00f6nnen unterschiedliche Reihenfolgen der Schl\u00fcssel oder dynamische Werte wie IDs und Zeitstempel enthalten. Ein einfacher String-Vergleich reicht hier nicht aus.<\/li>\n\n\n\n<li><strong>Lesbarkeit der Tests<\/strong>: Komplexe JSON-Strukturen manuell zu vergleichen kann un\u00fcbersichtlich und fehleranf\u00e4llig sein.<\/li>\n\n\n\n<li><strong>Unterst\u00fctzung von Teilvergleichen<\/strong>: Oft m\u00f6chte man nur bestimmte Teile eines JSON-Dokuments verifizieren, ohne das gesamte Dokument zu testen.<\/li>\n<\/ol>\n\n\n\n<p>JsonUnit adressiert all diese Punkte und bietet eine intuitive Syntax sowie leistungsstarke Features.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Installation und Einrichtung<\/h3>\n\n\n\n<p>Um JsonUnit in einem Java-Projekt zu verwenden, m\u00fcssen Sie die Bibliothek in Ihrer Build-Konfiguration hinzuf\u00fcgen. F\u00fcr ein Maven-Projekt sieht die Dependency wie folgt aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>net.javacrumbs.json-unit<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>json-unit<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>3.5.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Falls Sie Gradle verwenden, k\u00f6nnen Sie die Bibliothek wie folgt einbinden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">testImplementation <span class=\"hljs-string\">'net.javacrumbs.json-unit:json-unit:2.37.0'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nach der Einrichtung k\u00f6nnen Sie JsonUnit in Ihren Testklassen importieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">static<\/span> <span class=\"hljs-selector-tag\">net<\/span><span class=\"hljs-selector-class\">.javacrumbs<\/span><span class=\"hljs-selector-class\">.jsonunit<\/span><span class=\"hljs-selector-class\">.JsonAssert<\/span><span class=\"hljs-selector-class\">.assertJsonEquals<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlagen: JSON-Vergleich mit JsonUnit<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong>Einfacher Vergleich<\/strong><\/h4>\n\n\n\n<p>Der grundlegende Anwendungsfall von JsonUnit ist der Vergleich zweier JSON-Dokumente:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Test\n<span class=\"hljs-keyword\">void<\/span> testSimpleJsonComparison() {\n    <span class=\"hljs-built_in\">String<\/span> actualJson = <span class=\"hljs-string\">\"{\"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\", \"<\/span>age<span class=\"hljs-string\">\": 30}\"<\/span>;\n    <span class=\"hljs-built_in\">String<\/span> expectedJson = <span class=\"hljs-string\">\"{\"<\/span>age<span class=\"hljs-string\">\": 30, \"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\"}\"<\/span>;\n\n    assertJsonEquals(expectedJson, actualJson);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>JsonUnit ignoriert die Reihenfolge der Schl\u00fcssel und pr\u00fcft nur die Werte, was es ideal f\u00fcr JSON-Tests macht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. <strong>Vergleich mit Toleranz<\/strong><\/h4>\n\n\n\n<p>JsonUnit erlaubt es, numerische Werte mit einer Toleranz zu vergleichen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Test\n<span class=\"hljs-keyword\">void<\/span> testComparisonWithTolerance() {\n    <span class=\"hljs-built_in\">String<\/span> actualJson = <span class=\"hljs-string\">\"{\"<\/span>value<span class=\"hljs-string\">\": 99.9}\"<\/span>;\n    <span class=\"hljs-built_in\">String<\/span> expectedJson = <span class=\"hljs-string\">\"{\"<\/span>value<span class=\"hljs-string\">\": 100.0}\"<\/span>;\n\n    assertJsonEquals(expectedJson, actualJson, JsonAssert.withTolerance(<span class=\"hljs-number\">0.2<\/span>));\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Erweiterte Funktionen von JsonUnit<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong>Teilvergleich<\/strong><\/h4>\n\n\n\n<p>H\u00e4ufig m\u00f6chte man nur bestimmte Teile eines JSON-Dokuments \u00fcberpr\u00fcfen. JsonUnit bietet hierf\u00fcr die Methode <code>assertJsonPartEquals<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Test\n<span class=\"hljs-keyword\">void<\/span> testPartialComparison() {\n    <span class=\"hljs-built_in\">String<\/span> actualJson = <span class=\"hljs-string\">\"{\"<\/span>user<span class=\"hljs-string\">\": {\"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\", \"<\/span>age<span class=\"hljs-string\">\": 30}}\"<\/span>;\n    <span class=\"hljs-built_in\">String<\/span> expectedName = <span class=\"hljs-string\">\"John\"<\/span>;\n\n    assertJsonPartEquals(expectedName, actualJson, <span class=\"hljs-string\">\"user.name\"<\/span>);\n}\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">2. <strong>Ignorieren dynamischer Werte<\/strong><\/h4>\n\n\n\n<p>JsonUnit kann spezifische Felder ignorieren, die sich bei jedem Testlauf \u00e4ndern, z. B. IDs oder Zeitstempel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Test\n<span class=\"hljs-keyword\">void<\/span> testIgnoringDynamicValues() {\n    <span class=\"hljs-built_in\">String<\/span> actualJson = <span class=\"hljs-string\">\"{\"<\/span>id<span class=\"hljs-string\">\": 123, \"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\"}\"<\/span>;\n    <span class=\"hljs-built_in\">String<\/span> expectedJson = <span class=\"hljs-string\">\"{\"<\/span>id<span class=\"hljs-string\">\": \"<\/span>${json-unit.ignore}<span class=\"hljs-string\">\", \"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\"}\"<\/span>;\n\n    assertJsonEquals(expectedJson, actualJson);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">3. <strong>Vergleich mit JSON-Pfad-Ausdr\u00fccken<\/strong><\/h4>\n\n\n\n<p>JsonUnit unterst\u00fctzt JSONPath-Ausdr\u00fccke, um gezielt Teile des JSON-Dokuments zu pr\u00fcfen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Test\n<span class=\"hljs-keyword\">void<\/span> testWithJsonPath() {\n    <span class=\"hljs-built_in\">String<\/span> actualJson = <span class=\"hljs-string\">\"{\"<\/span>user<span class=\"hljs-string\">\": {\"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\", \"<\/span>roles<span class=\"hljs-string\">\": &#91;\"<\/span>admin<span class=\"hljs-string\">\", \"<\/span>user<span class=\"hljs-string\">\"]}}\"<\/span>;\n\n    assertJsonPartEquals(<span class=\"hljs-string\">\"admin\"<\/span>, actualJson, <span class=\"hljs-string\">\"user.roles&#91;0]\"<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Integration in Frameworks<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong>JUnit 5<\/strong><\/h4>\n\n\n\n<p>JsonUnit l\u00e4sst sich nahtlos in JUnit 5-Tests integrieren, indem die Methoden direkt in den Testf\u00e4llen verwendet werden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. <strong>Spring Boot<\/strong><\/h4>\n\n\n\n<p>In Spring-Boot-Anwendungen ist JsonUnit besonders hilfreich, um die Antworten von REST-APIs zu verifizieren. Hier ein Beispiel mit <code>MockMvc<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Test\nvoid testRestApiResponse() throws <span class=\"hljs-keyword\">Exception<\/span> {\n    mockMvc.perform(get(<span class=\"hljs-string\">\"\/api\/user\/1\"<\/span>))\n           .andExpect(status().isOk())\n           .andExpect(result -&gt; assertJsonEquals(<span class=\"hljs-string\">\"{\"<\/span>name<span class=\"hljs-string\">\": \"<\/span>John<span class=\"hljs-string\">\", \"<\/span>age<span class=\"hljs-string\">\": 30}\"<\/span>, result.getResponse().getContentAsString()));\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Best Practices<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Verwendung von Platzhaltern<\/strong>: Platzhalter wie <code>${json-unit.ignore}<\/code> erleichtern den Umgang mit dynamischen Werten.<\/li>\n\n\n\n<li><strong>Modularisierung von Tests<\/strong>: Lagern Sie erwartete JSON-Daten in separaten Dateien aus, um die Lesbarkeit und Wiederverwendbarkeit zu verbessern.<\/li>\n\n\n\n<li><strong>Kombination mit Mocking<\/strong>: Nutzen Sie JsonUnit in Kombination mit Mocking-Frameworks wie Mockito, um die R\u00fcckgaben von Services zu testen.<\/li>\n\n\n\n<li><strong>Toleranzen und Vergleichsmodi<\/strong>: Verwenden Sie Toleranzen und Modifikatoren wie <code>LENIENT<\/code>, um flexiblere Tests zu erstellen.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>JsonUnit ist ein m\u00e4chtiges Werkzeug f\u00fcr die Verifizierung von JSON-Daten in Unit-Tests. Es bietet eine Vielzahl von Funktionen, die \u00fcber einen einfachen Vergleich hinausgehen und Entwicklern die M\u00f6glichkeit geben, Tests flexibel und robust zu gestalten. Durch die Integration in bestehende Testframeworks und die einfache Handhabung wird JsonUnit zu einem unverzichtbaren Bestandteil moderner Java-Teststrategien.<\/p>\n\n\n\n<p>Mit JsonUnit k\u00f6nnen Sie sicherstellen, dass Ihre JSON-Strukturen korrekt und konsistent bleiben \u2013 ein entscheidender Schritt, um die Qualit\u00e4t Ihrer Anwendungen zu gew\u00e4hrleisten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In modernen Softwareprojekten ist JSON ein zentraler Bestandteil f\u00fcr die Kommunikation zwischen verschiedenen Systemen. Insbesondere bei der Entwicklung von APIs spielt JSON eine Schl\u00fcsselrolle, da es oft als Datenaustauschformat verwendet wird. Um die Integrit\u00e4t und Qualit\u00e4t der APIs sicherzustellen, ist das Testen von JSON-Inhalten unverzichtbar. Hier kommt JsonUnit ins Spiel, eine Java-Bibliothek, die speziell f\u00fcr [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-524","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=524"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/524\/revisions"}],"predecessor-version":[{"id":525,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/524\/revisions\/525"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}