{"id":411,"date":"2024-05-27T08:45:06","date_gmt":"2024-05-27T07:45:06","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=411"},"modified":"2024-06-14T08:50:15","modified_gmt":"2024-06-14T07:50:15","slug":"testcontainers-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=411","title":{"rendered":"Testcontainers in Java &#8211; Dockerisiertes Testen"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Die Qualit\u00e4t von Software ist entscheidend f\u00fcr ihren Erfolg. Eine der wichtigsten Methoden, um sicherzustellen, dass Software fehlerfrei und zuverl\u00e4ssig ist, besteht in der Durchf\u00fchrung umfassender Tests. Doch oft sind Testumgebungen komplex und schwer zu konfigurieren, besonders wenn externe Dienste wie Datenbanken, Message-Broker oder Webserver einbezogen werden m\u00fcssen. Hier kommt Testcontainers ins Spiel \u2013 eine Java-Bibliothek, die das Testen solcher Anwendungen erheblich vereinfacht.<\/p>\n\n\n\n<p>Testcontainers erm\u00f6glicht es Entwicklern, Docker-Container f\u00fcr die Integrationstests zu verwenden. Dies bedeutet, dass Sie Ihre Tests in einer isolierten und reproduzierbaren Umgebung ausf\u00fchren k\u00f6nnen, was die Zuverl\u00e4ssigkeit und Aussagekraft Ihrer Tests verbessert. In diesem Artikel werden wir die Grundlagen von Testcontainers erkunden, seine Hauptfunktionen erl\u00e4utern und anhand von Beispielen zeigen, wie Sie es in Ihren Projekten einsetzen k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundlagen von Testcontainers<\/h2>\n\n\n\n<p>Testcontainers ist eine Open-Source-Bibliothek, die speziell f\u00fcr die Unterst\u00fctzung von JUnit-Tests entwickelt wurde. Sie nutzt Docker, um leichtgewichtige, wegwerfbare Container f\u00fcr Ihre Tests bereitzustellen. Dies erm\u00f6glicht es, Dienste wie Datenbanken, Elasticsearch, Kafka und viele andere einfach zu testen, ohne dass Sie sie auf Ihrem lokalen Rechner oder CI-Server installieren m\u00fcssen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation und Einrichtung<\/h3>\n\n\n\n<p>Um Testcontainers zu verwenden, m\u00fcssen Sie sicherstellen, dass Docker auf Ihrem System installiert und konfiguriert ist. Danach k\u00f6nnen Sie Testcontainers in Ihrem Projekt integrieren. Falls Sie Maven verwenden, f\u00fcgen Sie folgende Abh\u00e4ngigkeit in Ihrer <code>pom.xml<\/code> hinzu:<\/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>org.testcontainers<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>testcontainers<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>1.17.6<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><\/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>F\u00fcr Gradle f\u00fcgen Sie diese Zeilen in Ihre <code>build.gradle<\/code>:<\/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\">'org.testcontainers:testcontainers:1.17.6'<\/span><\/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<h3 class=\"wp-block-heading\">Grundlegende Verwendung<\/h3>\n\n\n\n<p>Ein grundlegendes Beispiel f\u00fcr die Verwendung von Testcontainers ist das Testen einer PostgreSQL-Datenbank. Zun\u00e4chst m\u00fcssen Sie die erforderliche Abh\u00e4ngigkeit hinzuf\u00fcgen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" 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>org.testcontainers<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>postgresql<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>1.17.6<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><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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>Nun k\u00f6nnen Sie einen Testcontainer f\u00fcr PostgreSQL erstellen und in Ihren Tests verwenden:<\/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\"><span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.Test;\n<span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.extension.ExtendWith;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.containers.PostgreSQLContainer;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Container;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Testcontainers;\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.junit.jupiter.api.Assertions.assertTrue;\n\n@Testcontainers\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PostgreSQLContainerTest<\/span> <\/span>{\n\n    @Container\n    public PostgreSQLContainer&lt;?&gt; postgresContainer = <span class=\"hljs-keyword\">new<\/span> PostgreSQLContainer&lt;&gt;(<span class=\"hljs-string\">\"postgres:latest\"<\/span>);\n\n    @Test\n    <span class=\"hljs-keyword\">void<\/span> testDatabaseConnection() {\n        <span class=\"hljs-built_in\">String<\/span> jdbcUrl = postgresContainer.getJdbcUrl();\n        <span class=\"hljs-built_in\">String<\/span> username = postgresContainer.getUsername();\n        <span class=\"hljs-built_in\">String<\/span> password = postgresContainer.getPassword();\n\n        <span class=\"hljs-comment\">\/\/ Hier k\u00f6nnen Sie eine Verbindung zur Datenbank herstellen und Ihre Tests ausf\u00fchren<\/span>\n        <span class=\"hljs-comment\">\/\/ Beispiel: try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) { ... }<\/span>\n\n        assertTrue(postgresContainer.isRunning());\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>In diesem Beispiel wird ein PostgreSQL-Container gestartet, der w\u00e4hrend der Laufzeit des Tests zur Verf\u00fcgung steht. Nachdem der Test abgeschlossen ist, wird der Container automatisch gestoppt und entfernt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Erweiterte Funktionen<\/h2>\n\n\n\n<p>Neben der Unterst\u00fctzung f\u00fcr Datenbanken bietet Testcontainers viele weitere Funktionen und Integrationen, die das Testen komplexer Anwendungen erleichtern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Netzwerkunterst\u00fctzung<\/h3>\n\n\n\n<p>Testcontainers erm\u00f6glicht es Ihnen, Container in benutzerdefinierten Netzwerken zu starten, was n\u00fctzlich ist, wenn Sie mehrere Container haben, die miteinander kommunizieren m\u00fcssen. Hier ein Beispiel, wie Sie ein benutzerdefiniertes Netzwerk erstellen und Container darin starten k\u00f6nnen:<\/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> org.junit.jupiter.api.Test;\n<span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.extension.ExtendWith;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.containers.GenericContainer;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.containers.Network;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Container;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Testcontainers;\n\n@Testcontainers\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NetworkTest<\/span> <\/span>{\n\n    private Network network = Network.newNetwork();\n\n    @Container\n    public GenericContainer&lt;?&gt; redisContainer = <span class=\"hljs-keyword\">new<\/span> GenericContainer&lt;&gt;(<span class=\"hljs-string\">\"redis:latest\"<\/span>)\n        .withNetwork(network)\n        .withNetworkAliases(<span class=\"hljs-string\">\"redis\"<\/span>);\n\n    @Container\n    public GenericContainer&lt;?&gt; appContainer = <span class=\"hljs-keyword\">new<\/span> GenericContainer&lt;&gt;(<span class=\"hljs-string\">\"my-app:latest\"<\/span>)\n        .withNetwork(network)\n        .withEnv(<span class=\"hljs-string\">\"REDIS_HOST\"<\/span>, <span class=\"hljs-string\">\"redis\"<\/span>);\n\n    @Test\n    <span class=\"hljs-keyword\">void<\/span> testAppWithRedis() {\n        <span class=\"hljs-comment\">\/\/ Tests, die die App und den Redis-Container nutzen<\/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<h3 class=\"wp-block-heading\">Modulunterst\u00fctzung<\/h3>\n\n\n\n<p>Testcontainers bietet Unterst\u00fctzung f\u00fcr viele g\u00e4ngige Softwaremodule. Hier sind einige Beispiele:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Kafka<\/h4>\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\"><span class=\"hljs-keyword\">import<\/span> org.apache.kafka.clients.consumer.ConsumerConfig;\n<span class=\"hljs-keyword\">import<\/span> org.apache.kafka.clients.consumer.KafkaConsumer;\n<span class=\"hljs-keyword\">import<\/span> org.apache.kafka.clients.producer.KafkaProducer;\n<span class=\"hljs-keyword\">import<\/span> org.apache.kafka.clients.producer.ProducerConfig;\n<span class=\"hljs-keyword\">import<\/span> org.apache.kafka.clients.producer.ProducerRecord;\n<span class=\"hljs-keyword\">import<\/span> org.apache.kafka.common.serialization.StringDeserializer;\n<span class=\"hljs-keyword\">import<\/span> org.apache.kafka.common.serialization.StringSerializer;\n<span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.Test;\n<span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.extension.ExtendWith;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.containers.KafkaContainer;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Container;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Testcontainers;\n\n<span class=\"hljs-keyword\">import<\/span> java.util.Properties;\n\n@Testcontainers\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">KafkaTest<\/span> <\/span>{\n\n    @Container\n    public KafkaContainer kafkaContainer = <span class=\"hljs-keyword\">new<\/span> KafkaContainer(<span class=\"hljs-string\">\"confluentinc\/cp-kafka:latest\"<\/span>);\n\n    @Test\n    <span class=\"hljs-keyword\">void<\/span> testKafka() {\n        Properties producerProps = <span class=\"hljs-keyword\">new<\/span> Properties();\n        producerProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers());\n        producerProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\n        producerProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\n\n        KafkaProducer&lt;<span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-built_in\">String<\/span>&gt; producer = <span class=\"hljs-keyword\">new<\/span> KafkaProducer&lt;&gt;(producerProps);\n        producer.send(<span class=\"hljs-keyword\">new<\/span> ProducerRecord&lt;&gt;(<span class=\"hljs-string\">\"my-topic\"<\/span>, <span class=\"hljs-string\">\"key\"<\/span>, <span class=\"hljs-string\">\"value\"<\/span>));\n\n        Properties consumerProps = <span class=\"hljs-keyword\">new<\/span> Properties();\n        consumerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers());\n        consumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, <span class=\"hljs-string\">\"test-group\"<\/span>);\n        consumerProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());\n        consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());\n\n        KafkaConsumer&lt;<span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-built_in\">String<\/span>&gt; consumer = <span class=\"hljs-keyword\">new<\/span> KafkaConsumer&lt;&gt;(consumerProps);\n        consumer.subscribe(<span class=\"hljs-string\">\"my-topic\"<\/span>);\n        <span class=\"hljs-comment\">\/\/ Verarbeiten Sie die Nachrichten<\/span>\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\">Elasticsearch<\/h4>\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\"><span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.Test;\n<span class=\"hljs-keyword\">import<\/span> org.junit.jupiter.api.extension.ExtendWith;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.elasticsearch.ElasticsearchContainer;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Container;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Testcontainers;\n\n@Testcontainers\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ElasticsearchTest<\/span> <\/span>{\n\n    @Container\n    public ElasticsearchContainer elasticsearchContainer = <span class=\"hljs-keyword\">new<\/span> ElasticsearchContainer(<span class=\"hljs-string\">\"docker.elastic.co\/elasticsearch\/elasticsearch:7.10.1\"<\/span>);\n\n    @Test\n    <span class=\"hljs-keyword\">void<\/span> testElasticsearch() {\n        <span class=\"hljs-comment\">\/\/ Verbindung zum Elasticsearch-Container herstellen und Tests ausf\u00fchren<\/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\">Vorteile von Testcontainers<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Reproduzierbarkeit<\/strong>: Da die Tests in isolierten Docker-Containern laufen, sind sie unabh\u00e4ngig von der lokalen Umgebung des Entwicklers.<\/li>\n\n\n\n<li><strong>Einfachheit<\/strong>: Testcontainers bietet einfache API zur Verwaltung von Containern, was die Komplexit\u00e4t der Testeinrichtung reduziert.<\/li>\n\n\n\n<li><strong>Integration<\/strong>: Unterst\u00fctzung f\u00fcr viele g\u00e4ngige Softwaremodule wie Datenbanken, Kafka, Elasticsearch, etc.<\/li>\n\n\n\n<li><strong>Isolation<\/strong>: Jeder Test l\u00e4uft in seiner eigenen Umgebung, wodurch Seiteneffekte zwischen Tests vermieden werden.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Testcontainers ist ein leistungsf\u00e4higes Werkzeug, das Entwicklern hilft, zuverl\u00e4ssige und reproduzierbare Tests zu erstellen. Durch die Nutzung von Docker-Containern f\u00fcr die Testumgebung erm\u00f6glicht es Testcontainers, komplexe Abh\u00e4ngigkeiten einfach und effizient zu verwalten. Egal, ob Sie eine Datenbank, einen Message-Broker oder einen Webserver testen m\u00fcssen, Testcontainers bietet die Flexibilit\u00e4t und die Werkzeuge, die Sie ben\u00f6tigen, um Ihre Tests zu verbessern.<\/p>\n\n\n\n<p>Die in diesem Artikel vorgestellten Beispiele und Konzepte bieten einen soliden Einstieg in die Verwendung von Testcontainers. Mit diesen Grundlagen k\u00f6nnen Sie beginnen, Ihre eigenen Tests zu schreiben und die Qualit\u00e4t Ihrer Softwareprojekte signifikant zu verbessern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung Die Qualit\u00e4t von Software ist entscheidend f\u00fcr ihren Erfolg. Eine der wichtigsten Methoden, um sicherzustellen, dass Software fehlerfrei und zuverl\u00e4ssig ist, besteht in der Durchf\u00fchrung umfassender Tests. Doch oft sind Testumgebungen komplex und schwer zu konfigurieren, besonders wenn externe Dienste wie Datenbanken, Message-Broker oder Webserver einbezogen werden m\u00fcssen. Hier kommt Testcontainers ins Spiel \u2013 [&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-411","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\/411","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=411"}],"version-history":[{"count":2,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/411\/revisions"}],"predecessor-version":[{"id":414,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/411\/revisions\/414"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}