{"id":677,"date":"2026-05-30T00:31:57","date_gmt":"2026-05-29T23:31:57","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=677"},"modified":"2026-06-17T00:32:45","modified_gmt":"2026-06-16T23:32:45","slug":"rest-assured-rest-apis-professionell-testen-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=677","title":{"rendered":"REST Assured \u2014 REST-APIs professionell testen in Java"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">REST-Assured ist die inoffizielle Standardbibliothek zum Testen von REST-APIs in Java. Mit ihrer ausdrucksstarken, BDD-inspirierten Fluent-API lassen sich HTTP-Requests und deren Responses intuitiv formulieren und validieren. \u00dcber 7.000 GitHub-Sterne und die nahtlose Integration mit JUnit 5 machen REST Assured zur ersten Wahl f\u00fcr API-Tests. Seit Version 6.0.0 (Dezember 2025) setzt REST Assured auf Java 17+ als Baseline und bietet Support f\u00fcr Spring Framework 7, Jackson 3 und Groovy 5.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Erste Schritte<\/h2>\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>io.rest-assured<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>rest-assured<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>6.0.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 class=\"wp-block-paragraph\">REST Assured 6.x setzt Java 17 voraus. F\u00fcr Projekte, die noch auf Java 11\/8 laufen, steht die 5.x-Linie (aktuell 5.5.7) zur Verf\u00fcgung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Grundmuster von REST Assured folgt dem BDD-Prinzip&nbsp;<strong>given-when-then<\/strong>:<\/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\"><span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.Test;\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> io.restassured.RestAssured.*;\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.hamcrest.Matchers.*;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ApiTest<\/span> <\/span>{\n\n    @Test\n    <span class=\"hljs-keyword\">void<\/span> einfacherGetRequest() {\n        given()\n            .baseUri(<span class=\"hljs-string\">\"https:\/\/api.example.com\"<\/span>)\n        .when()\n            .get(<span class=\"hljs-string\">\"\/users\/42\"<\/span>)\n        .then()\n            .statusCode(<span class=\"hljs-number\">200<\/span>)\n            .body(<span class=\"hljs-string\">\"name\"<\/span>, equalTo(<span class=\"hljs-string\">\"Max Mustermann\"<\/span>))\n            .body(<span class=\"hljs-string\">\"email\"<\/span>, containsString(<span class=\"hljs-string\">\"@\"<\/span>));\n    }\n}\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 class=\"wp-block-paragraph\">Der Clou:&nbsp;<code>given()<\/code>&nbsp;beschreibt die Request-Parameter,&nbsp;<code>when()<\/code>&nbsp;f\u00fchrt den Request aus und&nbsp;<code>then()<\/code>&nbsp;validiert die Response \u2014 alles in flie\u00dfendem, lesbarem Java.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Statische Imports und Basiskonfiguration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr wiederkehrende Basis-URLs empfiehlt sich eine zentrale Konfiguration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.restassured.RestAssured;\n<span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.BeforeAll;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BaseApiTest<\/span> <\/span>{\n\n    @BeforeAll\n    <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> setup() {\n        RestAssured.baseURI = <span class=\"hljs-string\">\"http:\/\/localhost:8080\/api\"<\/span>;\n        RestAssured.port = <span class=\"hljs-number\">8080<\/span>;\n        RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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 class=\"wp-block-paragraph\">Mit&nbsp;<code>enableLoggingOfRequestAndResponseIfValidationFails()<\/code>&nbsp;werden Request und Response nur bei fehlgeschlagenen Tests geloggt \u2014 extrem hilfreich f\u00fcr die Fehlersuche.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JSON-Validierung mit JsonPath<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST Assured integriert&nbsp;<strong>JsonPath<\/strong>, eine Abfragesprache f\u00fcr JSON, die an XPath erinnert:<\/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> komplexeJsonValidierung() {\n    given()\n        .queryParam(<span class=\"hljs-string\">\"minPreis\"<\/span>, <span class=\"hljs-number\">20<\/span>)\n    .when()\n        .get(<span class=\"hljs-string\">\"\/buecher\"<\/span>)\n    .then()\n        .statusCode(<span class=\"hljs-number\">200<\/span>)\n        .body(<span class=\"hljs-string\">\"size()\"<\/span>, greaterThan(<span class=\"hljs-number\">0<\/span>))\n        .body(<span class=\"hljs-string\">\"findAll { it.preis &gt; 30 }.name\"<\/span>, hasItem(<span class=\"hljs-string\">\"Clean Code\"<\/span>))\n        .body(<span class=\"hljs-string\">\"max { it.preis }.name\"<\/span>, notNullValue());\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 class=\"wp-block-paragraph\">Neben&nbsp;<code>findAll<\/code>&nbsp;und&nbsp;<code>max<\/code>&nbsp;unterst\u00fctzt JsonPath auch&nbsp;<code>find<\/code>,&nbsp;<code>min<\/code>,&nbsp;<code>sum<\/code>&nbsp;und&nbsp;<code>collect<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">POST-Requests und Serialisierung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST Assured serialisiert Java-Objekte mithilfe eines konfigurierten ObjectMapper (standardm\u00e4\u00dfig Jackson) automatisch in JSON:<\/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\"><span class=\"hljs-keyword\">import<\/span> io.restassured.http.ContentType;\n\nrecord BuchRequest(<span class=\"hljs-built_in\">String<\/span> titel, <span class=\"hljs-built_in\">String<\/span> autor, double preis) {}\n\n@Test\n<span class=\"hljs-keyword\">void<\/span> buchErstellen() {\n    BuchRequest neuesBuch = <span class=\"hljs-keyword\">new<\/span> BuchRequest(<span class=\"hljs-string\">\"Domain-Driven Design\"<\/span>, <span class=\"hljs-string\">\"Eric Evans\"<\/span>, <span class=\"hljs-number\">44.99<\/span>);\n\n    given()\n        .contentType(ContentType.JSON)\n        .body(neuesBuch)\n    .when()\n        .post(<span class=\"hljs-string\">\"\/buecher\"<\/span>)\n    .then()\n        .statusCode(<span class=\"hljs-number\">201<\/span>)\n        .header(<span class=\"hljs-string\">\"Location\"<\/span>, notNullValue())\n        .body(<span class=\"hljs-string\">\"id\"<\/span>, notNullValue())\n        .body(<span class=\"hljs-string\">\"titel\"<\/span>, equalTo(<span class=\"hljs-string\">\"Domain-Driven Design\"<\/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<h2 class=\"wp-block-heading\">Authentifizierung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST Assured unterst\u00fctzt alle g\u00e4ngigen Auth-Mechanismen:<\/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\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ Basic Auth&lt;\/em&gt;<\/span>\ngiven().auth().basic(<span class=\"hljs-string\">\"username\"<\/span>, <span class=\"hljs-string\">\"password\"<\/span>).when().get(<span class=\"hljs-string\">\"\/secure\"<\/span>);\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ OAuth 2.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\ngiven().auth().oauth2(<span class=\"hljs-string\">\"access-token-xyz\"<\/span>).when().get(<span class=\"hljs-string\">\"\/api\/protected\"<\/span>);\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ API-Key<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\ngiven().header(<span class=\"hljs-string\">\"X-API-Key\"<\/span>, <span class=\"hljs-string\">\"secret-key\"<\/span>).when().get(<span class=\"hljs-string\">\"\/external-api\"<\/span>);\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<h2 class=\"wp-block-heading\">Response-Daten extrahieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Manchmal ben\u00f6tigt man Daten aus einer Response f\u00fcr den n\u00e4chsten Request:<\/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> responseDatenWiederverwenden() {\n    <span class=\"hljs-built_in\">String<\/span> userId = given()\n        .body(<span class=\"hljs-keyword\">new<\/span> BuchRequest(<span class=\"hljs-string\">\"Effective Java\"<\/span>, <span class=\"hljs-string\">\"Joshua Bloch\"<\/span>, <span class=\"hljs-number\">39.90<\/span>))\n    .when()\n        .post(<span class=\"hljs-string\">\"\/buecher\"<\/span>)\n    .then()\n        .statusCode(<span class=\"hljs-number\">201<\/span>)\n        .extract()\n        .path(<span class=\"hljs-string\">\"id\"<\/span>);\n\n    <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Verwende die ID im n\u00e4chsten Request<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n    given()\n    .when()\n        .get(<span class=\"hljs-string\">\"\/buecher\/\"<\/span> + userId)\n    .then()\n        .statusCode(<span class=\"hljs-number\">200<\/span>);\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<h2 class=\"wp-block-heading\">Schema-Validierung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mit&nbsp;<code>json-schema-validator<\/code>&nbsp;lassen sich Responses gegen ein JSON Schema pr\u00fcfen. Dazu wird das Modul als zus\u00e4tzliche Abh\u00e4ngigkeit ben\u00f6tigt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" 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>io.rest-assured<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-schema-validator<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>6.0.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-8\"><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<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> io.restassured.module.jsv.JsonSchemaValidator.*;\n\n@Test\n<span class=\"hljs-keyword\">void<\/span> responseSchemaValidieren() {\n    given()\n    .when()\n        .get(<span class=\"hljs-string\">\"\/users\"<\/span>)\n    .then()\n        .assertThat()\n        .body(matchesJsonSchemaInClasspath(<span class=\"hljs-string\">\"user-schema.json\"<\/span>));\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\">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<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST Assured macht API-Tests zu einer dankbaren Aufgabe: Die Fluent-API ist sofort verst\u00e4ndlich, JsonPath und Hamcrest-Matchers erm\u00f6glichen pr\u00e4zise Validierungen und Authentifizierungsmechanismen sind direkt integriert. In Kombination mit Testcontainers f\u00fcr echte HTTP-Calls entstehen robuste, aussagekr\u00e4ftige Integrationstests, die im CI\/CD-Pipeline verl\u00e4sslich die API-Qualit\u00e4t sichern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>REST-Assured ist die inoffizielle Standardbibliothek zum Testen von REST-APIs in Java. Mit ihrer ausdrucksstarken, BDD-inspirierten Fluent-API lassen sich HTTP-Requests und deren Responses intuitiv formulieren und validieren. \u00dcber 7.000 GitHub-Sterne und die nahtlose Integration mit JUnit 5 machen REST Assured zur ersten Wahl f\u00fcr API-Tests. Seit Version 6.0.0 (Dezember 2025) setzt REST Assured auf Java 17+ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-677","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/677","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=677"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/677\/revisions"}],"predecessor-version":[{"id":678,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/677\/revisions\/678"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=677"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=677"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}